【发布时间】:2018-03-08 02:29:00
【问题描述】:
我定义了以下运算符:
:- op(200, xfx, plus).
:- op(100, xfx, times).
我想实现一个谓词 translate/2,以便给定的术语仅由数字和运算符 plus 和 times 组成,这样这些运算符将被翻译成它们相应的算术运算符:+ 和 *。
例如:
?- 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.
很抱歉没有为我的条款如何工作添加更具体的 cmets。这里的想法是生成一个列表,其中 te 运算符被相应的术语替换。我的问题是输出是一个列表而不是一个术语。有没有办法扭转我对 =.. 运算符所做的事情???
【问题讨论】:
-
你自己尝试过什么?什么不工作?你遇到了什么问题?
标签: prolog operators predicate operator-precedence