Prolog - 合并符号(或术语?)

时间:2011-07-27 14:03:13

标签: prolog

(请原谅我的术语是错的......我是Prolog的新手。)

假设您有一系列符号出现在某些未知数量的谓词中。

f1(a, b, c, d).
f2(b, b, c).
...
fn(b, d, e).

稍后 - 在运行时 - 您意识到术语ab是相同的,并且您希望合并它们或将其中一个替换为另一个。换句话说,我想要:

  • 制作a = b
  • a的所有实例替换为b
  • ab替换为新符号(通过gensym / 2制作)
  • ......或其他任何可以实现此目的的

...我不知道哪些谓词使用这些术语。

1 个答案:

答案 0 :(得分:3)

以大写字母开头的原子是变量。然后,第一步是使用AB。如果在某些时候你决定两个变量实际上是相等的,你只需要说A = B。逻辑上陈述一件事=另一件事的过程是“统一”。

e.g。

veryDifferentOrTheSame(A,B) :- veryDifferent(A,B).
veryDifferentOrTheSame(A,B) :- A = B.

当然,统一并不总是有效。 a(X) = b(X)将失败。

这一切都意味着在编写代码时,您知道您不确定A = B.

您还可以在运行时动态断言子句。将子句声明为动态并使用assera或assertz。

但如果你说:

iOwn(goldfish).
iOwnFish :- iOwn(fish).

然后想通过说“在我的宇宙中鱼=金鱼”来做这项工作,然后你就在陌生的领域。