1

我正在尝试编写一个小程序,将给定的目标分解为所有最小的部分并最终评估它们。到目前为止,我有:

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)) :-andtest((Goal1;Goal2)) :-规则拆分那些,最终达到单一事实。当传递一个奇异事实时,Body如果可以解决,则从句/2 将实例化为 true。

算术会出现问题。在上面的程序中,最终会有一个单一的目标,X = 'john'这会导致条款/2(私有过程?)的错误。我介绍了test(X = Y) :-捕获这种情况的规则,以便我可以用另一种方式处理它。然而,我真正想要的是一个可以捕捉所有算术的规则。显然我不能写出一个规则test(X = Y) :-来捕捉所有可能的算术类型。

我的目标是最终编写一个可以处理任何类型的规则的可归纳元解释器。

如果这些都没有任何意义,请告诉我,我会尽力澄清:)

4

1 回答 1

0

元解释器这是 Prolog 的“强项”之一。请参阅Markus Triska 的这个页面,了解这个有趣的主题。

正如 Little Booby Tables 建议的那样,您可以使用简单的方法来捕获算术

test(X is Y) :- X is Y.

顺便说一句,我认为你这里有一个错字

test((Goal1;Goal2)) :- test(Goal1), test(Goal2).

应该

test((Goal1;Goal2)) :- test(Goal1) ; test(Goal2).

编辑:如果需要,可以推广与运营商的合作。只是所需的内置函数的一个示例:

?- X = (1+2), X =.. [F, A, B], current_op(U, V, F).
X = 1+2,
F = (+),
A = 1,
B = 2,
U = 200,
V = fy .
于 2013-05-21T09:27:56.293 回答