在Picat中存在评估构造函数还是更像Prolog?

时间:2016-11-09 19:08:27

标签: prolog picat

我想在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中找不到。

1 个答案:

答案 0 :(得分:3)

试试这个:

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

这是在Picat中创建结构的另一种方法。使用new_struct,您可以创建一个结构,作为第一个参数传递您要创建的结构的名称,并将第二个参数作为整数(将是结构的字段数)或列表。在后一种情况下,结构的字段将是列表的元素。

即使我无法理解为什么在创建point之前不会评估表达式。如果我在书中没有错误使用Picat解决约束,则说在调用评估之前完全评估了参数。