如何检查序言中是否有两个代表相同的事实

bb2*_*bb2 1 prolog

我很难理解这一点。假设我有:

person(peter).
person(bob).
person(amanda).
Run Code Online (Sandbox Code Playgroud)

有没有办法证明没有两个人有相同的名字?我试着做:

person(X) = person(Y).
Run Code Online (Sandbox Code Playgroud)

但这给出了:

X = Y
Run Code Online (Sandbox Code Playgroud)

还是这就够了??

Pet*_*ris 5

在上面,您正在使用一元关系person/1(代表单个参数)。您定义了 peter、bob 和 amanda 是人的事实。然后你问Prolog的统一person(X)person(Y),即找到的最普遍的价值观X,并Y使得式成立。当然,我们只需要Y = X为此作出答复。

如果你想强制执行这样的条件,你需要用名字以外的东西来代表人们,否则他们将隐式相等。

说使用 id。

person(1).
person(2).
person(3).

name(1, peter).
name(2, bob).
name(3, amanda).
Run Code Online (Sandbox Code Playgroud)

然后查询

?- name(Y, X), name(Z, X), Y \= Z.
Run Code Online (Sandbox Code Playgroud)