【问题标题】:Not Equal Operation in swi-prologswi-prolog中的不相等操作
【发布时间】:2017-12-01 10:26:10
【问题描述】:

我正在尝试比较 prolog 中的两个 peano 的数字,但有些结果是错误的。

任何人都可以帮助我,这是我的代码:

%Not Equal
notequal(0,s(A),X).
notequal(s(A),0,X).
notequal(s(A),s(B),C):- A/=B .

%Not Equal
notequal(0,s(A),X).
notequal(s(A),0,X).
notequal(s(A),s(B),C):- minus(A,s(0),S1),minus(B,s(0),S2),notequal(S1,S2,C) .

输出:

?- notequal(s(0),s(s(0)),S).
false.

?- notequal(s(0),0,S).
true .

?- notequal(0,s(0),S).
true.

第一次输出错误

谢谢。

【问题讨论】:

    标签: prolog compare successor-arithmetics


    【解决方案1】:

    这样的谓词不需要三个参数,毕竟你想描述两个数字之间的关系。你的最后一条规则应该再次调用谓词本身:

    notequal(0,s(_)).
    notequal(s(_),0).
    notequal(s(A),s(B)) :-  % s(A) and s(B) are not equal if
       notequal(A,B).       % A and B are not equal
    

    这会产生您想要的答案:

    ?- notequal(0,0).
    false.
    
    ?- notequal(0,s(0)).
    true.
    
    ?- notequal(s(0),s(0)).
    false.
    
    ?- notequal(s(s(0)),s(0)).
    true ;
    false.
    
    ?- notequal(s(s(0)),0).
    true ;
    false.
    

    您也可以只实例化一个参数来使用它:

    ?- notequal(s(0),B).
    B = 0 ;
    B = s(s(_G2450)).
    
    ?- notequal(A,s(0)).
    A = 0 ;
    A = s(s(_G2450)).
    

    正如您所见,这两个答案涵盖了所有可能性。即使是最一般的查询也在产生解决方案:

    ?- notequal(A,B).
    A = 0,
    B = s(_G2456) ;
    A = s(_G2456),
    B = 0 ;
    A = s(0),
    B = s(s(_G2460)) ;
    A = s(s(_G2460)),
    B = s(0) ;
    A = s(s(0)),
    B = s(s(s(_G2464))) ;
    .
    .
    .
    

    【讨论】:

      【解决方案2】:

      如果您不需要找出两个数字的实际顺序(例如,基于比较的排序),而只需要说明安全项不等式,请使用广泛可用的内置谓词 dif/2

      一些示例查询:

      ?- dif(0, 0).
      false.
      
      ?- dif(0, s(0)).
      true.
      
      ?- dif(s(0), s(0)).
      false.
      
      ?- dif(s(s(0)), s(0)).
      true.
      
      ?- dif(s(s(0)), 0).
      true.
      

      这在最一般的情况下也安全工作:

      ?- dif(A, B).
      dif(A, B).             % residual goal indicates pending disequality constraint
      

      【讨论】:

        猜你喜欢
        • 2012-04-02
        • 1970-01-01
        • 2012-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多