Prolog 序言-将目标分解为单个事实和算术

Prolog 序言-将目标分解为单个事实和算术,prolog,Prolog,我正试图编写一个小程序,将给定的目标分解为所有最小的部分,并最终对它们进行评估。到目前为止,我已经: 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((Goal

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

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递归检查规则,例如,如果我调用testalienjohn。当它到达这样一个点,身体只包含一些事实,比如来自Marsx,来自Saturnx;fromJupiterX,X='john'它将使用testGoal1、Goal2:-和testGoal1拆分这些对象;目标二:规则,最终达成单一事实。当传递一个单数事实时,子句/2会将Body实例化为true(如果可以解决)

算术出现了问题。在上面的程序中,最终将出现单一目标X='john',这将导致子句/2 private procedure?出错?。我引入了规则testX=Y:-来捕捉这个案例,这样我就可以用另一种方式来处理它。然而,我真正想要的是一条规则,它将涵盖所有的算术。显然,我不能用testX=Y:-的样式编写规则来捕获所有可能的算术类型

我的目标是最终编写一个诱因元解释程序,它可以处理任何类型的规则


如果这些都没有意义,请告诉我,我将尝试澄清:

元解释器这是Prolog的“优点”之一。从马库斯·特里斯卡那里了解这个有趣的主题

正如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 .

在Prolog=是统一运算符时,算术由is关键字处理,例如X是Y+1。是否有一种简单的方法可以捕获X