仅使用“ +”将代数表达式拆分成单独的原子和数字列表

时间:2018-12-22 11:11:16

标签: prolog

我正在尝试创建谓词split_exp,该谓词采用仅使用“ +”函子的代数表达式,并生成两个列表,一个原子和一个数字。例如,1 + a + b + 3应该生成[1,3]和[a,b]。表达式可以是任何长度。 我已经尝试过了。

split_exp(X,[X|[]],[]):-number(X).
split_exp(X,[],[X|[]]):-atom(X).
split_exp(X+Y,[X|Ns],Na):-number(X),split_exp(Y,Ns,Na).
split_exp(X+Y,Ns,[X|Na]):-atom(X),split_exp(Y,Ns,Na).

请向我解释在此实现中我要去哪里。

1 个答案:

答案 0 :(得分:0)

应该易于从您的代码中发现,更正和简化:

split_exp(X,[X],[]):-number(X).
split_exp(X,[],[X]):-atom(X).
split_exp(Y+X,[X|Ns],As):-number(X),split_exp(Y,Ns,As).
split_exp(Y+X,Ns,[X|As]):-atom(X),split_exp(Y,Ns,As).

注意递归调用,仍然使用Y。由于(+)/ 2保持关联性(?- current_op(_,A,+)产生A=yfx作为第二结果,因为还有一元形式),因此必须在 left 分支上递归我确实在头中交换了X和Y子项。

您可以使用内置的ISO ?- write_canonical(E)?- display(E).来显示表情形状