Поиск всех объединений в прологе

Я написал свой первый простой код в 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]].
Другие вопросы по тегам