Пролог: Как вы перебираете два списка (гнездо для цикла)? - PullRequest
0 голосов
/ 09 октября 2018

Я только начал изучать Пролог на этой неделе, поэтому я не уверен, возможны ли циклы for в Прологе.У меня есть два списка в Прологе

stringList([hi,hello],[bye,later],X).

Как мне создать новый список решений с одним элементом на список?

Таким образом, вывод должен быть:

X = [hi,bye]
X = [hi,later]
X = [hello,bye]
X = [hello,later]

1 Ответ

0 голосов
/ 09 октября 2018

Основным преимуществом при использовании Пролога является то, что вы можете делегировать таких циклов в движок Prolog .Вам не нужно писать их явно.

Например, в вашем случае подумайте о проблеме следующим образом: Что содержит (или должно содержать) о X?

Мы можем сказать:

  1. X - это список с двумя элементами, скажем, [A,B].
  2. A является членомсписка, который обозначен первым аргументом.
  3. 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]].

Это иногда называют пространственным представлением, потому что решения больше не найдены при возврате (временное представление)), но представлены в явном виде.

Отсюда видно, что «циклы» соответствуют рекурсивным определениям.

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