Prolog - 如何在给定通常形式的情况下获得数学计算的前缀形式?

Prolog - How can obtain the prefix form of a math calculation given its usual form?

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

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

您可以使用 atom_to_term/3 and =../2 to obtain a prefix form of an arithmetic expression. 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]]