如何使事实在Prolog中双向工作(以任何顺序接受参数)?

时间:2014-04-21 18:18:41

标签: prolog reverse

我想要定义两种方式都是真实的事实(它们都具有2的精神)。我成功地表达了这种关系"对立"这样:

oppositeDeclare(plus, minus).

opposite(X, Y) :- oppositeDeclare(Y, X).
opposite(X, Y) :- oppositeDeclare(X, Y).

我试图制作一个简单的方程求解器,我还想定义如果A = B则B = A.我不能写:

equal(A, B):-equal(B,A).

因为我摆脱了本地堆栈错误。但是,我不能像对待"反对"那样做。事实是因为"等于"需要根据一些规则来工作。 ("对面"仅从事实得到它)。

有没有办法可以避免为"等于"定义所有规则?两次?

修改

我只想宣布简单的数学事实,看看我是否可以使用Prolog来解决其他更复杂的任务,我不知道解决方案的机制只是简单的事实。

到目前为止,我使用了equal / 2来定义如下内容:如果A = B + C,则C = A-B。我想定义相等/ 2两种方式,这样我就不必定义B + C = A,然后A-B = C.理想情况下,在新规则之后,它可以像这样解决c的等式:a =(b + c)/ d - > b + c = a / d - > C =(A / d)-b。

我无法使用swap的原因是因为我有等于/ 2的递归规则。

请记住,即使对于简单的方程式也不总是有效,因为并非所有必要的事实都被定义。

这是带有查询的当前程序:

5 ?- equal(v, X).
X = opr(s, per, t) 

% operators: per, times, plus, minus
% equation(LHS, RHS): used to declare physics equations
% equal(LHS, RHS): checks equality in a query

equation(s, opr(v, times, t)). % s=v*t
equation(a, opr(opr(b, plus, c), per, d)). %  a=(b+c)/d

oppositeDeclare(plus, minus).
oppositeDeclare(per, times).

opposite(X, Y) :- oppositeDeclare(Y, X).
opposite(X, Y) :- oppositeDeclare(X, Y).

equal(R, opr(A, O, B)) :- equation(R, opr(A, O, B)).       
% if there's an equation R=A O B , then R = A O B, where O is an operator (+-*/)

equal(A, opr(R, OY, B)) :- equal(R, opr(A, OX, B)), opposite(OY, OX). 
%declaring in one go: if R=A/B then A=R*B, if R=A-B then A=R+B, if R=A+B then A=R-B, if R=A-B then A=R+B

1 个答案:

答案 0 :(得分:1)

我不确定我是否理解正确,但是你不是在这个简单的代码之后吗?

equal(X, X).

您能否使用equal/2显示您想要实现的一些示例输入和输出?

关于对立面,我会这样写:

oppositeDeclare(plus, minus).
oppositeDeclare(good, evil).
oppositeDeclare(windows, linux).

swap(P, X, Y) :-  permutation([X,Y], [X1,Y1]), call(P, X1, Y1).

opposite(X, Y) :- swap(oppositeDeclare, X, Y).

任何时候你想使用带有arity 2的谓词并尝试交换参数,你可以用上面给出的方式使用swap/3