2017-09-26 5 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 plus b)times 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

関連する問題