我想在Picat中快速创建一个结构。但是在创建结构时应该评估结构的组件。到目前为止,我尝试过,当组件已经是常量时,它给了我一个结构:
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统一。以下是Picat中Prolog统一的一些例子:
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中找不到。
答案 0 :(得分:3)
试试这个:
Picat> X = new_struct(point, [1+2,3*4]).
X = point(3,12)
yes
这是在Picat中创建结构的另一种方法。使用new_struct
,您可以创建一个结构,作为第一个参数传递您要创建的结构的名称,并将第二个参数作为整数(将是结构的字段数)或列表。在后一种情况下,结构的字段将是列表的元素。
即使我无法理解为什么在创建point
之前不会评估表达式。如果我在书中没有错误使用Picat解决约束,则说在调用评估之前完全评估了参数。