Prolog'=='运算符不起作用?

时间:2016-11-20 17:08:38

标签: prolog

我做了一个计算矢量长度和2D数组大小的函数。

以下是该功能。我正在使用 swi-prolog

foo(LIST) :- listLength(LIST, COUNT1), twoDarray(COUNT2), 
write("vector len : "), write(COUNT1), 
write(",  2D array size : "), write(COUNT2).

是的,我故意排除详细的listLength, twoDarray功能。

然而,两个功能是正确的。因此,COUNT1变量存储矢量长度,COUNT2变量存储2D数组大小。

输入变量LIST也表示向量。二维表是固定的(7乘7)。

当我使用输入运行代码时:

  

? - foo([1,2,3,4,5])。

输出:

  

矢量len:5,2D数组大小:49

result(1)

但是,当我修改上面的代码时,

foo(LIST) :- listLength(LIST, COUNT1), twoDarray(COUNT2), 
(COUNT1 == COUNT2).

功能未终止。我的目标是比较COUNT1COUNT2。如果两个变量相同,则返回true,否则返回false

但是,即使使用相同的输入也无法正常工作。

result(2)

造成这种情况的原因是什么,我该如何解决?

2 个答案:

答案 0 :(得分:0)

由于Prolog解释器在目标失败时回溯,它会重试twoDarray/1以防它可能返回COUNT2的另一个值。默认情况下,Prolog关系有多个答案。你必须告诉Prolog机器一个特定的关系是一个函数,即它只允许一个答案。

要告诉关系是否正常,您可以使用 cut 运算符。如果您不想更改twoDarray/1listLength/2的定义,可以直接在foo/1的定义中引入剪切。剪切运算符由感叹号字符表示。

foo(LIST) :- listLength(LIST, COUNT1), twoDarray(COUNT2),!, 
(COUNT1 == COUNT2).

答案 1 :(得分:0)

以下代码

listLength(_, 5).
twoDarray(49).

foo(LIST) :-
  listLength(LIST, COUNT1),
  twoDarray(COUNT2),
  (COUNT1 == COUNT2).

使用我的gprolog和我的swi-prolog工作(立即返回错误)。

所以,我想,问题出在您的listLength/2twoDarray/1

建议:将我的listLength/2替换为假的,然后重试。

接下来尝试使用我的假twoDarray/1