当前位置 : 首页 » 互动问答 » 正文

在swi-prolog中不等于操作

分类 : 互动问答 | 发布时间 : 2018-04-27 18:14:15 | 评论 : 2 | 浏览 : 55 | 喜欢 : 0

我试图比较两个 peano的数字 in prolog,但一些resualt是错误的。

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

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

OR

%不等于
notequal(0,S(A),X)。
notequal(S(A),0,X)。
notequal(s(A),s(B),C): - 减(A,s(0),S1),减(B,s(0),S2),notequal(S1,S2,C)。

输出:

? -  notequal(s(0),s(s(0)),S)。
假。

? -  notequal(s(0),0,S)。
真的。

? -  notequal(0,s(0),S)。
真正。

第一个输出错误

谢谢。

回答(2)

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

     notequal(0,s(_))。
    notequal(S(_),0)。
    notequal(s(A),s(B)): - %s(A)和s(B)不相等
       notequal(A,B)。 %A和B不相等
    

    这产生你想要的答案:

    ? -  notequal(0,0)。
    假。
    
    ? -  notequal(0,s(0))。
    真正。
    
    ? -  notequal(s(0),s(0))。
    假。
    
    ? -  notequal(s(s(0)),s(0))。
    真实;
    假。
    
    ? -  notequal(s(s(0)),0)。
    真实;
    假。
    

    你也可以在只有一个参数实例化的情况下使用它:

    ? -  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楼
  • 如果你不需要找出两个数字的实际顺序 - 比如说,基于比较的排序 - 但只需要声明安全的term disequality,则使用广泛可用的内置谓词dif/2!

    一些示例查询:<notranslate >? - dif(0,0)。 假。 ? - dif(0,s(0))。 真正。 (s(0),s(0))。 假。 (s(0)),s(0))。 真正。 (s(0)),0)。 真正。

    在最常见的情况下,这也适用于

    safely? - dif(A,B)。 dif(A,B)。剩余目标百分比表示待处理的不平等限制

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

相关阅读: