Должно быть легко обнаружить из вашего кода, исправить и упростить:
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
как второй результат, так как есть также унарная форма), вы должны вернуться на левую ветвь, которую я поменял местами X иПодтермы Y в заголовке (ах).
Вы можете отобразить форму выражения, используя встроенную ISO ?- write_canonical(E)
или ?- display(E).