相关疑难解决方法(0)

使用\ ==/2或dif/2

如果我想确保两个变量不实例化到同一个术语,那么首选方法是什么?

假设我需要在图中找到有向边,并且节点不能有自己的边:

node(a, x, y). node(b, z, x). node(c, y, y).
Run Code Online (Sandbox Code Playgroud)

(这里的边是 - > c,b - > a,但不是 c - > c)

以下作品:

edge(A, B) :- node(A, _, X), node(B, X, _), A \== B.
Run Code Online (Sandbox Code Playgroud)

这也有效[swi-prolog]:

edge(A, B) :- dif(A, B), node(A, _, X), node(B, X, _).
Run Code Online (Sandbox Code Playgroud)

这显然不起作用(因为A和B都没有被实例化?):

edge(A, B) :- A \== B, node(A, _, X), node(B, X, _).
Run Code Online (Sandbox Code Playgroud)

我想我的第一个解决方案的问题是,使用更复杂的node谓词,在edge失败之前可能会发生许多不必要的统一.在dif另一方面,是在图书馆,这表明它并不意味着在这种简单的情况下使用(虽然它,我似乎在寻找精确的功能).

prolog prolog-dif logical-purity

16
推荐指数
3
解决办法
2002
查看次数

Prolog:不平等运算符

我正在使用SICStus Prolog并拥有一系列事实:

student('John Henry', 'Maths').
student('Jim Henry', 'Maths').
student('John Alan', 'Maths').
student('Alan Smith', 'Computing').
student('Gary Henry', 'Maths'). 
Run Code Online (Sandbox Code Playgroud)

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

sharedSubject(S1, S2, Sub) :- S1 \== S2, student(S1, Sub), student(S2, Sub).
Run Code Online (Sandbox Code Playgroud)

但是,当我输入:

sharedSubject('John Henry', F, E).                     
Run Code Online (Sandbox Code Playgroud)

我得到F = 'John Henry'.有人可以指出我出错的地方以及我需要做什么吗?谢谢.

prolog prolog-dif

6
推荐指数
2
解决办法
3857
查看次数

标签 统计

prolog ×2

prolog-dif ×2

logical-purity ×1