Создание кортежей из двух списков - PullRequest
1 голос
/ 10 апреля 2020

Я новичок в Прологе, и у меня есть два кортежа из двух списков, использующих рекурсию. Например, fun c ([1, 2, 3], [4, 5, 6]) должно выводить [(1, 4), (1,5), (1,6), (2, 4) , (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]. У меня есть следующий код:

func([],_,[]).
func([X|T1],Y,[Z|W]):-
    match(X,Y,Z),
    func(T1,Y,W).

match(X,[Y],[(X,Y)]).
match(X,[Y|T],[(X,Y)|Z]) :-
    match(X,T,Z).

Но мой вывод для удовольствия c ([1,2,3], [4,5,6], X) это X = [[(1, 4), (1, 5), (1, 6)], [(2, 4), (2, 5), (2, 6)], [(3, 4), (3, 5), ( 3, 6)]].

Как мне избавиться от лишних квадратных скобок в середине моего вывода? Я пытался играть с круглыми скобками и скобками в обеих моих функциях, но не могу понять.

1 Ответ

1 голос
/ 10 апреля 2020

Используя стандартный предикат findall/3 и стандартный предикат member/2 де-факто:

| ?- findall(X-Y, (member(X,[1,2,3]), member(Y,[4,5,6])), Pairs).

Pairs = [1-4,1-5,1-6,2-4,2-5,2-6,3-4,3-5,3-6]
yes

Чтобы понять это решение, обратите внимание, что для каждого значения X мы перечисляем, возвращая все значения Y. Т.е. при возврате (как неявно выполняется предикат findall/3 для построения списка всех решений его второго аргумента), мы исчерпываем все решения для последней точки выбора (цель member(Y,[4,5,6])), прежде чем вернуться к предыдущему выбору - точка (цель member(X,[1,2,3])). Это известно как хронологическое возвращение назад и является одной из определяющих характеристик Пролога.

Обратите внимание, что я использовал X-Y, обычное представление Пролога для пары , вместо (X,Y), который не является рекомендуемым решением для построения n-кортежей, так как он хорошо работает только для пар элементов.

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