2017-09-26 54 views
0

我已經定義了以下運算符:序言 - 翻譯運營商

:- op(200, xfx, plus). 
:- op(100, xfx, times). 

我想實現一個謂語翻譯/ 2,這樣僅由數字給定的期限和經營者以及和時間,使這些運營商將被轉換爲相應的算術運算符:+和*。

例如:

?- translate((4 plus 5), Result). 
    Result = 4 + 5. 

?- translate(((3 times 2) times 7 plus 4), Result). 
    Result = (3 * 2) * 7 + 4. 

?-translate((5 times 3 plus 4 times 5)), Result). 
    Result = 5 * 3 + 4 * 5. 

更新:還好吧,使代碼伊夫拿出到目前爲止有是:

replace([], _, _, []). 

replace([El1|List], El1, El2, [El2|Result]) :- 
replace(List, El1, El2, Result), !. 

replace([H|List], El1, El2, [H|Result]) :- 
replace(List, El1, El2, Result). %replaces an element in a list with 
            %another element. 


translate(Term, ListResult2):- 
    Term =.. ListResult, 
    replace(ListResult, times, *, ListResult1), 
    replace(ListResult1, plus, +, ListResult2). %This will make a list of a 
               % a term and replace the 
               %operators the right way.         

對不起,沒有在我的條款是如何工作增添了更多的具體意見。這裏的想法是生成一個列表,其中te操作符被相應的術語替換。我的問題是輸出是一個列表而不是一個術語。有沒有辦法扭轉我用=操作符做的事情?

+0

你嘗試過自己嗎?什麼不起作用?你遇到什麼問題? –

回答

0

我想我找到了解決方案,這是我錯過了某種語法。我忘了= ..運營商可以爲雙方提供解決方案。所以X = .. [1,2,3]會將列表[1,2,3]轉換爲相應的術語,反之亦然。該解決方案是這樣的:

replace([], _, _, []). 

replace([El1|List], El1, El2, [El2|Result]) :- 
replace(List, El1, El2, Result), !. 

replace([H|List], El1, El2, [H|Result]) :- 
replace(List, El1, El2, Result). 


translate(Term, TrueResult):- 
    Term =.. ListResult, 
    replace(ListResult, times, *, ListResult1), 
    replace(ListResult1, plus, +, ListResult2), 
    TrueResult =.. ListResult2. 
+0

如果你的例子是遞歸的呢?像'(a + b)次c'? –

+0

慶祝太早...所以我需要檢查我加/次是列表成員的一部分,然後替換而不是隻看到加/次作爲一個可能的成員。 –

0

像這樣的東西可能會滿足您的需求:

:- op(200, yfx, plus). 
:- op(100, yfx, times). 

translate(Z, Z1):- 
    (
    nonvar(Z), 
    Z \= _ plus _, 
    Z \= _ times _ 
) -> Z1=Z ; 
    (
    member(Z-Z1, [(X plus Y)-(X1 + Y1), (X times Y)-(X1 * Y1)]), 
    translate(X, X1), 
    translate(Y, Y1) 
). 

測試用例:

?- translate((4 plus 5), Result). 
Result = 4+5 
?- translate(((3 times 2) times 7 plus 4), Result). 
Result = 3*2*7+4 
?- translate((5 times 3 plus 4 times 5), Result). 
Result = 5*3+4*5 
?- translate((a plus b) times c, Result). 
Result = (a+b)*c 
?- translate(5 times (3 plus 4) times 5, Result). 
Result = 5* (3+4)*5 
+0

非常感謝!你認爲這也可以用上面顯示的= ..方法來完成,否則它最終會變得過於不切合實際? –

+0

@WillemvanderSpek:我想你可能會使用'= ..'來實現它,儘管你應該修改你的過程來遞歸地調用每個操作數。 – gusbro