【发布时间】:2014-01-26 00:00:21
【问题描述】:
我正在尝试编写一个小程序,将给定的目标分解为所有最小的部分并最终评估它们。到目前为止,我有:
alien(X) :- fromMars(X), fromSaturn(X); fromJupiter(X), X = 'john'.
fromMars(john).
fromSaturn(john).
fromJupiter(john).
test(true) :- !.
test((Goal1,Goal2)) :- test(Goal1), test(Goal2).
test((Goal1;Goal2)) :- test(Goal1), test(Goal2).
test(X = Y) :- call(X = Y).
test(Goal) :- clause(Goal,Body),test(Body).
据我所知,这将递归地检查使用条款/2 的规则,例如如果我打电话给 test(alien(john)). 。当它达到Body 仅包含诸如fromMars(X), fromSaturn(X); fromJupiter(X), X = 'john' 之类的事实时,它将使用test((Goal1,Goal2)) :- 和test((Goal1;Goal2)) :- 规则拆分这些事实,最终达到单一事实。当传递一个奇异事实时,如果可以解决,则 Clause/2 将实例化 Body 为 true。
算术会出现问题。在上面的程序中,最终会有一个单一的目标X = 'john' 这会导致条款/2(私有过程?)的错误。我引入了规则test(X = Y) :- 来捕捉这种情况,这样我就可以用另一种方式处理它。然而,我真正想要的是一个可以捕捉所有算术的规则。显然,我不能以test(X = Y) :- 的风格编写规则来捕获所有可能的算术类型。
我的目标是最终编写一个可以处理任何类型的规则的可溯源元解释器。
如果这些都没有任何意义,请告诉我,我会尽力澄清:)
【问题讨论】:
-
在 Prolog 中
=是统一运算符,算术由is关键字处理,例如X is Y + 1.
标签: prolog