Как сказано в разделе комментариев, вам нужно проверить, имеют ли две пары в списке одинаковую координату X.Итак, первое решение, которое приходит на ум, может быть примерно таким (добавлено несколько писем для отображения значений):
solution1(L):-
member([X,Y1],L),
member([X,Y2],L),
writeln([X,Y1]),
writeln([X,Y2]).
Предикат member/2
проверяет, присутствует ли первый элемент в списке, переданный какВторой параметрЗапустив запрос ?- solution1([[1,1],[1,3],[2,3],[3,3]]).
, мы получим следующий результат:
?- solution1([[1,1],[1,3],[2,3],[3,3]]).
[1, 1]
[1, 1]
true
[1, 1]
[1, 3]
true
[1, 3]
[1, 1]
true
[1, 3]
[1, 3]
true
[2, 3]
[2, 3]
true
[3, 3]
[3, 3]
true
Ммм, много решений и не совсем то, что мы хотим.Одна из проблем заключается в том, что, написанная таким образом, member/2
проверяет весь список, поэтому мы получаем решение в каждом случае, потому что каждая пара, выбранная при первом вызове memeber/2
, находится в списке.Со вторым member/2
мы можем выбрать тот же элемент, чтобы предикат успешно выполнялся.Чтобы избежать такого поведения, мы можем написать предикат следующим образом:
solution2([[A,_]|T]):-
member([A,_],T).
solution2([[_,_]|T]):-
solution2(T).
С помощью этого второго предиката мы проверяем, присутствует ли выбранный элемент в остальной части списка, и поэтому мы исключаем сам элемент изпоиск, и мы получаем только одно решение.
?- solution2([[1,1],[1,3],[2,3],[3,3]]).
true
false
Обратите внимание, что это очень простая реализация, может быть, есть более эффективные методы для решения этой проблемы.