1

我想在 Picat 中快速创建一个结构。但是在创建结构时应该评估结构的组件。到目前为止,我尝试过,当组件已经是常量时,它给了我一个结构:

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

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

但以下不起作用,即应该评估的组件。我期待结果是 X = point(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 中也找不到。

4

1 回答 1

2

尝试这个:

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

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

即使我无法理解为什么在创建point. 如果我在使用 Picat进行约束求解一书中没有错的话,那就是在评估调用之前对参数进行完全评估。

于 2017-06-29T05:53:59.153 回答