我正在尝试创建谓词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).
请向我解释在此实现中我要去哪里。
答案 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).
来显示表情形状