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

Prolog 序言-合并符号(或术语?),prolog,Prolog,(如果我的术语有误,请原谅……我不熟悉Prolog。) 假设有一系列符号出现在未知数量的谓词中 f1(a, b, c, d). f2(b, b, c). ... fn(b, d, e). 稍后——在运行时——您会发现术语a和b是相同的,您希望将它们合并或将其中一个替换为另一个。换言之,我想: 使a=b 将a的所有实例替换为b 将a和b替换为新符号(通过gensym/2制作) …或者其他任何能实现这一点的东西 。。。我不知道哪些谓词使用这些术语。以大写字母开头的原子是变量。然后,第一步是使用

(如果我的术语有误,请原谅……我不熟悉Prolog。)

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

f1(a, b, c, d).
f2(b, b, c).
...
fn(b, d, e).
稍后——在运行时——您会发现术语
a
b
是相同的,您希望将它们合并或将其中一个替换为另一个。换言之,我想:

  • 使
    a=b
  • a
    的所有实例替换为
    b
  • a
    b
    替换为新符号(通过gensym/2制作)
  • …或者其他任何能实现这一点的东西

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

以大写字母开头的原子是变量。然后,第一步是使用
A
B
。如果在某一点上你决定两个变量实际上相等,你只需说它
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).

然后想通过说“在我的宇宙中鱼=金鱼”来实现这一点,那么你就进入了一个奇怪的领域。

以大写字母开头的原子是变量。然后,第一步是使用
A
B
。如果在某一点上你决定两个变量实际上相等,你只需说它
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).

然后想通过说“在我的宇宙中鱼=金鱼”来实现这一点,那么你就进入了一个陌生的领域。

简单地使用小写字母
a
b
在序言中给出了所谓的“原子”,这是一种类似字符串的常量,但存储在一个特殊的表中,这样它们就可以存储在那里一次,并通过查找在程序中的任何地方引用。[这种方法是Prolog早期实现的遗留,在Prolog中,内存是一种稀缺资源。]大多数Prolog都有创建新atom的方法,而不是以小写字母开头,但是不允许更改已经存在的atom表条目的文本。简单使用小写的
a
b
在Prolog中给出了所谓的“atoms”,这是一种类似字符串的常量,但存储在一个特殊的表中,以便它们可以存储在那里一次,并通过查找在程序中的任何地方引用。[这种方法是Prolog早期实现的遗留,在Prolog中,内存是一种稀缺资源。]大多数Prolog都有办法创建一个新的atom,它不以小写字母开头,但不允许更改已经存在的atom表项的文本。