【问题标题】:Prolog: inequality operatorProlog:不等式运算符
【发布时间】:2013-11-15 20:42:47
【问题描述】:

我正在使用 SICStus Prolog 并且有一组事实:

student('John Henry', 'Maths').
student('Jim Henry', 'Maths').
student('John Alan', 'Maths').
student('Alan Smith', 'Computing').
student('Gary Henry', 'Maths'). 

我想获得两个学生不同的两个学生的共同主题,所以我得到了:

sharedSubject(S1, S2, Sub) :- S1 \== S2, student(S1, Sub), student(S2, Sub).

但是,当我进入时:

sharedSubject('John Henry', F, E).                     

我收到F = 'John Henry'。有人可以指出我哪里出错了,我需要做什么?谢谢。

【问题讨论】:

  • 两个很好的答案。因为解释,我选择了保罗的那个。我之前没有考虑过实例化。

标签: prolog prolog-dif


【解决方案1】:

改用dif/2,或在规则末尾设置\== - 这不如dif/2 安全。另见:

Difference between X\=Y and dif(X,Y)

What is the logical 'not' in Prolog?

Using \==/2 or dif/2

【讨论】:

    【解决方案2】:

    您必须将S1 \== S2 目标移动到末尾。如果您调用 sharedSubject/3 谓词时没有实例化第二个参数,就像在您的 sharedSubject('John Henry', F, E) 中一样,S1 \== S2 目标将始终为真:

    ?- 'John Henry' \== S2.
    true.
    

    还有:

    ?- S1 \== S2.
    true.
    

    请参阅 Prolog 系统文档中的标准 (\==)/2 内置谓词的文档。简而言之,除非您想测试两个变量是否相同,否则请确保在调用此术语 equality 谓词时实例化两个参数。

    【讨论】:

      猜你喜欢
      • 2010-11-05
      • 2015-01-05
      • 2010-11-27
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 2018-03-08
      相关资源
      最近更新 更多