我正在尝试编写一个小程序,将给定的目标分解为所有最小的部分并最终评估它们。到目前为止,我有:
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) :-
来捕捉所有可能的算术类型。
我的目标是最终编写一个可以处理任何类型的规则的可归纳元解释器。
如果这些都没有任何意义,请告诉我,我会尽力澄清:)