Основным преимуществом при использовании Пролога является то, что вы можете делегировать таких циклов в движок Prolog .Вам не нужно писать их явно.
Например, в вашем случае подумайте о проблеме следующим образом: Что содержит (или должно содержать) о X
?
Мы можем сказать:
X
- это список с двумя элементами, скажем, [A,B]
. A
является членомсписка, который обозначен первым аргументом. B
является членом списка, который обозначен вторым аргументом.
Итак, в прологе:
one_from_each(As, Bs, [A,B]) :-
member(A, As),
member(B, Bs).
Пример запроса:
?- one_from_each([hi,hello],[bye,later], X).
X = [hi, bye] ;
X = [hi, later] ;
X = [hello, bye] ;
X = [hello, later].
И он работает и в других направлениях :
?- one_from_each(As, Bs, [hi,bye]).
As = [hi|_4656],
Bs = [bye|_4662] ;
As = [hi|_4656],
Bs = [_4660, bye|_4668] ;
As = [hi|_4656],
Bs = [_4660, _4666, bye|_4674] .
Следовательно, весь вопрос несколько ошибочен,При кодировании на Прологе всегда спрашивайте: как мне сформулировать, что должно удерживать ?Если у вас есть такая формулировка, вы можете оставить поиск решений движку Prolog!
Если вы хотите , вы можете быть более точным.Например:
one_from_each([], _) --> [].
one_from_each([L|Ls], Rs) -->
one_from_each_(Rs, L),
one_from_each(Ls, Rs).
one_from_each_([], _) --> [].
one_from_each_([R|Rs], L) -->
[[L,R]],
one_from_each_(Rs, L).
Пример:
?- phrase(one_from_each([hi,hello],[bye,later]), Ls).
Ls = [[hi, bye], [hi, later], [hello, bye], [hello, later]].
Это иногда называют пространственным представлением, потому что решения больше не найдены при возврате (временное представление)), но представлены в явном виде.
Отсюда видно, что «циклы» соответствуют рекурсивным определениям.