Цикл и изменение отдельного списка в Прологе - PullRequest
1 голос
/ 06 февраля 2020

У меня есть список с именем X, и я пытаюсь перебрать список, у меня есть отдельный список Y, где элементами Y являются (U, V), где U - X + 1, а V - X-1. Я пытался добавить U и V к Y безуспешно. ТАК это должно работать так, чтобы, если X равен [4,5,6], Y будет [(3,5), (4,6), (5,7)]

/**
list_looping([], _).
list_looping([H|T],A) :-
   x is H-1,
   x is H+1,
   append([(x,y),T],A).

pairs([],[]).
pairs([H|T],[(U,V),L]):-
   list_looping([H|T],[(U,V),L]).
*/
pairs(X,Y) :-
   forall(member(X,[1,2,3]),((U is X+1,V is X-1),writeln((U,V)))).

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

1 Ответ

3 голосов
/ 06 февраля 2020
list_pairs([], []).
list_pairs([X|Xs], [(U,V)|UVs]) :-
   U is X-1,
   V is X+1,
   list_pairs(Xs, UVs).

или более компактно

list_pairs2(Xs, UVs) :-
   maplist(e_pair, Xs, UVs).

e_pair(X, (U,V)) :-
   U is X-1,
   V is X+1.

и наиболее компактно с использованием library(lambda) для SICStus | SWI

list_pairs3(Xs, UVs) :-
   maplist(\X^(U,V)^( U is X-1, V is X+1 ), Xs, UVs).

Чаще всего эти предикаты даже не называются, а напрямую использует цель maplist.

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