使用Prolog实现后缀到前缀的转换

使用Prolog实现后缀到前缀的转换,prolog,Prolog,有人能帮我写一个程序吗?在PROLOG中使用堆栈概念,将算术表达式从后缀(反向波兰符号)转换为前缀形式。算术表达式可能包含4个算术运算符+,-,/,*和一元函数:sin、cos、tan、exp、log和sqrt。/2这是一个有用的列表组合器。它允许以相当一般的方式在任意数量的列表之间建立连接关系。这里我只展示基本的,你需要完成你的作业,添加一些细节作为一元函数,定义isop/1 pos2pre(Pos, Pre) :- append([A, B, [O]], Pos), isop(O),

有人能帮我写一个程序吗?在PROLOG中使用堆栈概念,将算术表达式从后缀(反向波兰符号)转换为前缀形式。算术表达式可能包含4个算术运算符+,-,/,*和一元函数:
sin、cos、tan、exp、log和sqrt。
/2这是一个有用的列表组合器。它允许以相当一般的方式在任意数量的列表之间建立连接关系。这里我只展示基本的,你需要完成你的作业,添加一些细节作为一元函数,定义isop/1

pos2pre(Pos, Pre) :-
    append([A, B, [O]], Pos), isop(O), A \= [], B \= [],
    pos2pre(A, APre),
    pos2pre(B, BPre),
    !, append([[O], APre, BPre], Pre).
pos2pre([P], [P]).
一个小测试:

?- pos2pre([1,5,*,2,+],X).
X = [+, *, 1, 5, 2].
我认为您应该尝试编写相同的逻辑,但使用/3,这将帮助您理解该过程是如何工作的。

/2这是一个有用的列表组合器。它允许以相当一般的方式在任意数量的列表之间建立连接关系。这里我只展示基本的,你需要完成你的作业,添加一些细节作为一元函数,定义isop/1

pos2pre(Pos, Pre) :-
    append([A, B, [O]], Pos), isop(O), A \= [], B \= [],
    pos2pre(A, APre),
    pos2pre(B, BPre),
    !, append([[O], APre, BPre], Pre).
pos2pre([P], [P]).
一个小测试:

?- pos2pre([1,5,*,2,+],X).
X = [+, *, 1, 5, 2].

我认为您应该尝试编写相同的逻辑,但使用/3,这将有助于您理解该过程是如何工作的。

为什么需要堆栈?Prolog已经是一种“堆叠”语言。输入格式到底是什么?(为了回答您的问题:是的,我可以)输入格式和预期输出格式如下?-post2pre([9,4,+,2,5,-,exp,/],X)。X=[/,+,9,4,exp,-,2,5]为什么需要堆栈?Prolog已经是一种“堆叠”语言。输入格式到底是什么?(为了回答您的问题:是的,我可以)输入格式和预期输出格式如下?-post2pre([9,4,+,2,5,-,exp,/],X)。X=[/,+,9,4,exp,-,2,5]