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]]
我是 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]]