Пролог - Разбиение алгебраического выражения с использованием только «+» на отдельные списки атомов и чисел - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь создать предикат 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 голосов
/ 22 декабря 2018

Должно быть легко обнаружить из вашего кода, исправить и упростить:

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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...