Пролог проверка координат - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь просмотреть списки списков и вернуть true, если указанное значение появляется дважды в данной строке.Например,

%B is a list of lists such the positions of x are denoted by the values
[[1,1],[2,3],[3,2]] would be visualized like:
x--
--x
-x-

, и эти координаты будут представлены буквой B, поэтому метод foo (B) где B =

[[1,1],[1,3],[2,3],[3,3]] = true

, так как x дважды появится в первой строке.

1 Ответ

0 голосов
/ 14 декабря 2018

Как сказано в разделе комментариев, вам нужно проверить, имеют ли две пары в списке одинаковую координату 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

Обратите внимание, что это очень простая реализация, может быть, есть более эффективные методы для решения этой проблемы.

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