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

问题描述 投票:0回答:2

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

prolog picat
2个回答
3
投票

试试这个:

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

这是在 Picat 中创建结构的另一种方法。使用

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

即使我无法理解为什么在创建

point
之前不评估表达式。如果我在书中没记错的话用Picat解决约束据说在评估调用之前完全评估参数。


0
投票

使用

=..

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

X =.. [a, b, c]
将 X 设置为
$a(b, c)
。请注意,这不适用于嵌套结构;如果要将 X 设置为
$point($x(b), $y(c))
,则需要按照 Mark 的建议使用
new_struct

Picat> X = new_struct(point, [new_struct(x, [1+2]), new_struct(y, [3+4])]).
X = point(x(3),y(7))
yes
© www.soinside.com 2019 - 2024. All rights reserved.