Поиск всех объединений в прологе
Я написал свой первый простой код в PROLOG:
is_beginning([], _).
is_beginning([FirstLetterB|RestWordB], [FirstLetterW|RestWordW]) :-
FirstLetterB == FirstLetterW,
is_beginning(RestWordB, RestWordW).
Он предназначен для определения, равен ли первый аргумент is_beginning второму аргументу начало. Ну, ИМХО, он вполне может ответить на вопросы, но теперь мне интересно, есть ли возможность получить все возможные ответы для определенного второго аргумента. например. за
is_beginning(Answers, [a,b,c]);
Я хочу получить [], [a], [a,b], [a,b,c] как объединение Ответов, но я получаю только [] (самый простой ответ).
Есть ли возможность получить то, что я хочу? Может быть, что-то не так в моем определении? Я уже пытался использовать findall и forall, но это не работает для меня:(
Спасибо за все ответы.
2 ответа
Вы используете ( ==) / 2, когда не нужно (обратите внимание на комментарий в конце страницы документации). Действительно, если вы измените его на "простое" объединение (=)/2, ваша программа будет работать так, как вы ожидаете:
is_beginning([], _).
is_beginning([FirstLetterB|RestWordB], [FirstLetterW|RestWordW]) :-
FirstLetterB = FirstLetterW,
is_beginning(RestWordB, RestWordW).
тестовое задание:
?- is_beginning(Answers, [a,b,c]).
Answers = [] ;
Answers = [a] ;
Answers = [a, b] ;
Answers = [a, b, c] ;
false.
Переводчик не сразу вернет все решения. Когда он вернется []
, Нажмите ";" сказать ему, чтобы продолжить поиск:
?- is_beginning(X, [a,b,c]).
X = [] ;
X = [a] ;
X = [a, b] ;
X = [a, b, c] ;
false.
Если вам нужны все эти решения в списке Пролога, а не просто распечатаны в консоли, findall/3
это действительно то, что вы ищете:
?- findall(X, is_beginning(X, [a,b,c]), L).
L = [[], [a], [a, b], [a, b, c]].