2017-09-26 56 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