我是prolog的新手,我想编制一个计算器。为此,我需要编写一个谓词,该谓词处理给定的算术表达式,以通常的形式(中缀形式)编写,以便获得其前缀形式。 表达式的元素将被分组为具有3个元素的子列表,其形式如下[operator,term1,term2],这样这些术语可以在其轮次列表中。 应该定义一个名为parse的谓词,并在此示例中起作用:
?-parse([1,+,2,*,3],PF).
PF=[+,1,[*,2,3]]
答案 0 :(得分:0)
您可以使用atom_to_term/3
和=../2
来获取算术表达式的前缀形式。 atomic_list_concat/2
将从您的输入列表中创建一个原子,然后atom_to_term
将构建一个术语(这将是您的算术表达式的中缀表示)。然后,使用univ(=..
),您可以递归获取前缀表示法。
即:
parse(LExp, PF):-
atomic_list_concat(LExp, Exp),
atom_to_term(Exp, Term, _),
parse1(Term, PF).
parse1(Term, PF):-
Term =.. [PF].
parse1(Term, [Op, Left, Right]):-
Term =.. [Op, TLeft, TRight],
parse1(TLeft, Left),
parse1(TRight, Right).
测试用例:
?- parse([1,+,2,*,3],PF).
PF = [+, 1, [*, 2, 3]]