【问题标题】:Prolog '==' operator is not working?Prolog '==' 运算符不起作用?
【发布时间】:2016-11-21 01:38:33
【问题描述】:

我做了一个计算向量长度和二维数组大小的函数。

下面是函数。我正在使用 swi-prolog

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

是的,我特意排除了详细的listLength, twoDarrayfunction。

但是有两个函数是正确的。所以,COUNT1 变量存储向量长度,COUNT2 变量存储二维数组大小。

另外输入变量LIST 表示向量。二维表是固定的。(7 x 7)。

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

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

它输出:

向量长度:5,二维数组大小:49

但是,当我像下面这样修改上面的代码时,

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

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

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

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

【问题讨论】:

    标签: prolog


    【解决方案1】:

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

    要判断一个关系是函数式的,你可以使用 cut 操作符。如果您不想更改twoDarray/1listLength/2 的定义,可以将cut 直接引入foo/1 的定义中。剪切运算符由感叹号字符表示。

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

    【讨论】:

      【解决方案2】:

      以下代码

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

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

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

      建议:用我的假的替换你的listLength/2,然后再试一次。

      接下来试试我的假twoDarray/1

      【讨论】:

        猜你喜欢
        • 2017-06-25
        • 2010-11-27
        • 2022-06-21
        • 1970-01-01
        • 2016-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多