這裏是一個替代版本。這一個構建從後綴列表第一爲2-或3-元素列表嵌套列表結構(每個一元或二元運算)前綴結構,然後只在平坦化結束時的嵌套列表:
post2pre(Post, Pre) :-
post2pre(Post, [], Pre).
post2pre([E|T], PreNest, Pre) :-
( unary_op(E)
-> PreNest = [Term|PNT],
post2pre(T, [[E,Term]|PNT], Pre)
; binary_op(E)
-> PreNest = [Term2,Term1|PNT],
post2pre(T, [[E,Term1,Term2]|AP], Pre)
; post2pre(T, [E|PreNest], Pre)
).
post2pre([], PreNest, Pre) :-
flatten(PreNest, Pre).
unary_op(X) :-
memberchk(X, [sin, cos, tan]).
binary_op(X) :-
memberchk(X, [+, -, /, *]).
在上面的代碼,「原子項」隱含地定義爲不是運算符的任何東西。
每爲例:
| ?- post2pre([1,2,3,+,*,sin],Pre).
Pre = [sin,*,1,+,2,3]
yes
在這種情況下,「中間」嵌套形式,發生flatten
之前,將是:
[sin, [*, 1, [+, 2, 3]]]
的非如果 - 則 - 否則版本上面的代碼可以寫成如下。我選擇了上面的if-then-else構造,因爲它避免了冗餘地檢查運算符:
post2pre(Post, Pre) :-
post2pre(Post, [], Pre).
post2pre([E|T], PreNest, Pre) :-
atomic_term(E),
post2pre(T, [E|PreNest], Pre).
post2pre([E|T], [Term|PNT], Pre) :-
unary_op(E)
post2pre(T, [[E,Term]|PNT], Pre).
post2pre([E|T], [Term2,Term1|PNT], Pre) :-
binary_op(E)
post2pre(T, [[E,Term1,Term2]|AP], Pre).
post2pre([], PreNest, Pre) :-
flatten(PreNest, Pre).
atomic_term(X) :- % This defines a term explicitly as anything but an operator
\+ unary_op(X),
\+ binary_op(X).
unary_op(X) :-
memberchk(X, [sin, cos, tan]).
binary_op(X) :-
memberchk(X, [+, -, /, *]).
我已經運行鏈接I post中指定的代碼。但問題是我的思想仍然無法用思路的方式思考。 –