Prolog - 如何根据通常的形式获得数学计算的前缀形式?

时间:2016-11-10 13:53:56

标签: prolog expression dcg

我是prolog的新手,我想编制一个计算器。为此,我需要编写一个谓词,该谓词处理给定的算术表达式,以通常的形式(中缀形式)编写,以便获得其前缀形式。 表达式的元素将被分组为具有3个元素的子列表,其形式如下[operator,term1,term2],这样这些术语可以在其轮次列表中。 应该定义一个名为parse的谓词,并在此示例中起作用:

?-parse([1,+,2,*,3],PF).
PF=[+,1,[*,2,3]] 

1 个答案:

答案 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]]