我想定義兩種方式都是真實的事實(它們都具有2的秩序)。我曾與表達「相反」這樣的關係的事實的成功:如何在Prolog中以雙向方式工作(以任何順序參數)?
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的解決其他更復雜的任務,我不知道只是解決簡單的事實的機制。
到目前爲止,我已經使用了等於/ 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。
我不能使用交換的原因是因爲我有等於/ 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
您也可以 - 同樣地將您用於'相反/ 2'的方法應用於'equal/2'。不過,通常情況下,首先要進行某種形式的標準化。 – false
正如@法爾斯所說的,儘量讓自己的事實與規則不同,就像你爲'對面/ 2'所做的那樣。例如,事實'equal_item(a,b)。 equal_item(a,c).'然後規則'equals(A,B): - equal_item(A,B); equal_item(B,A)。'等於(A,B):等於(B,A)。'的規則是循環邏輯和無限遞歸。 – lurker