我想在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中也找不到它们。
发布于 2017-06-29 13:53:59
试试这个:
Picat> X = new_struct(point, [1+2,3*4]).
X = point(3,12)
yes这是在Picat中创建结构的另一种方式。使用new_struct,您可以创建一个结构,第一个参数是要创建的结构的名称,第二个参数是一个整数(这将是结构的字段数)或一个列表。在后一种情况下,结构的字段将是列表的元素。
甚至我都不明白为什么在创建point之前不对表达式求值。如果我没记错的话,书中说用Picat进行约束求解是指在计算调用之前,参数是完全计算的。
https://stackoverflow.com/questions/40514260
复制相似问题