我做了一个计算矢量长度和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
但是,当我修改上面的代码时,
foo(LIST) :- listLength(LIST, COUNT1), twoDarray(COUNT2),
(COUNT1 == COUNT2).
功能未终止。我的目标是比较COUNT1
和COUNT2
。如果两个变量相同,则返回true
,否则返回false
。
但是,即使使用相同的输入也无法正常工作。
造成这种情况的原因是什么,我该如何解决?
答案 0 :(得分:0)
由于Prolog解释器在目标失败时回溯,它会重试twoDarray/1
以防它可能返回COUNT2的另一个值。默认情况下,Prolog关系有多个答案。你必须告诉Prolog机器一个特定的关系是一个函数,即它只允许一个答案。
要告诉关系是否正常,您可以使用 cut 运算符。如果您不想更改twoDarray/1
和listLength/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/2
或twoDarray/1
。
建议:将我的listLength/2
替换为假的,然后重试。
接下来尝试使用我的假twoDarray/1
。