我正在尝试编写一个小程序,将一个给定的目标分解为所有最小的部分并最终对它们进行评估。到目前为止,我有:
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)) :-
规则对其进行分割,最终达到单数事实。当传递一个单一的事实时,如果可以解决,则子句/ 2将Body
实例化为真。
算术出现问题。在上面的程序中,最终会出现单个目标X = 'john'
这会导致子句/ 2(私有过程?)出错。我引入了规则test(X = Y) :-
来捕捉这个案例,所以我可以用另一种方式处理它。然而,我真正想要的是一个能够捕获所有算术的规则。显然,我不能以test(X = Y) :-
的方式编写规则来捕获所有可能类型的算术。
我的目标是最终编写一个可以处理抛出任何类型规则的外展元互操作程序。
如果这些都没有任何意义,请告诉我,我会尝试澄清:)
答案 0 :(得分:0)
正如Little Booby Tables所建议的那样,你可以用简单的东西来捕捉算术
test(X is Y) :- X is Y.
BTW我认为你这里有一个错字
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 .