2016-11-09 38 views
1

我想在Picat中快速創建一個結構。但是在創建結構時應該評估結構的組成部分。到目前爲止,我試過了,這給了我當組件已經常數的結構:評估構造函數是否存在於Picat中?還是更像Prolog?

Picat 2.0b5, (C) picat-lang.org, 2013-2016. 

Picat> X = $point(2,3). 
X = point(2,3) 
yes 

但下面不工作,應進行評估,即組件。我期待,結果X =點(3,12),但它並沒有給這樣的結果:

Picat> X = $point(1+2,3*4). 
X = point(1 + 2,3 * 4) 
yes 

什麼是做到這一點的最簡單的辦法?看起來,Picat($)/ 1運算符就像lisp引號運算符,它可以防止Picat評估。 Prolog統一是什麼。下面是統一的Prolog的一些例子在Picat:

Picat> $point(X,Y) = $point(1+2,3*4). 
X = 1 + 2 
Y = 3 * 4 
yes 

Picat> $point(X+Y,Z) = $point(1+2,3*4). 
X = 1 
Y = 2 
Z = 3 * 4 
yes 

Picat> $X = $point(1+2,3*4).   
X = point(1 + 2,3 * 4) 
yes 

如Prolog的表述如1 + 2和3 * 4不被評估內部($)/ 1。也許不可能在Picat中評估構造函數,目前它們在標準Prolog中也沒有。

回答

2

試試這個:

Picat> X = new_struct(point, [1+2,3*4]). 
X = point(3,12) 
yes 

這是另一種方式Picat創建結構。通過new_struct,您可以創建一個結構作爲第一個參數傳遞要創建的結構的名稱,並將第二個參數作爲第二個參數或一個整數(這將是結構的字段數)或一個列表。在後一種情況下,結構的字段將成爲列表的元素。

即使我不明白爲什麼表達式在創建point之前未被評估。如果我在本書中沒有錯用Picat解決約束條件是在評估調用之前完全評估參數。