Отдельная ось координат внутри списка в Прологе - PullRequest
0 голосов
/ 06 мая 2018

Допустим, у меня есть список, элементы которого содержат координаты точки, например [(4,4), (3,4), (2,4), (1,4)], и я хочу проверить, находится ли определенная точка ниже или выше определенной линии или столбца

Так, например, функция

get_list_below_line([(4,4), (3,4), (2,4), (1,4)], 3, ResultList).

Будет выводить:

ResultList = [(2,4), (1,4)]

Моя проблема здесь в том, как мне выделить, например, ось X/Y по заданной координате, чтобы я мог арифметически сравнить ее со значением Line? Поскольку каждый элемент списка имеет формат (Line,Column), как я могу получить только значение Line из этой точки? Например, с помощью Head|Tails можно получить заданную полную координату (2,4), как я могу получить только 2?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

В SWI-Prolog (и других) вы можете использовать предикаты «высшего порядка» с библиотекой ( yall ):

get_list_below_line(List, XMax, Below) :-
  include({XMax}/[(X, _)] >> (X < XMax), List, Below).

или что-то «старый добрый стиль»

get_list_below_line(List, XMax, Below) :-
  findall((X, Y), (member((X, Y), List), X < XMax), Below).

Оба подхода применяют сопоставление с образцом, чтобы получить элемент X из пары координат. Кстати, обратите внимание, что кортежи (то есть пара) являются просто составными, имеющими запятую (то есть (,)/2) в качестве функтора. Использование их для структурирования больших кусков ПО мало что дает.

0 голосов
/ 06 мая 2018

Рекурсивный предикат, с одним случаем для X < XMax, где точка (X,Y) является частью Result, и другим случаем для X >= XMax, где это не так:

get_list_below_line([], _, []).
get_list_below_line([(X,Y)|Points], XMax, [(X,Y)|Result]) :-
    X < XMax,
    get_list_below_line(Points, XMax, Result).
get_list_below_line([(X,Y)|Points], XMax, Result) :-
    X >= XMax,
    get_list_below_line(Points, XMax, Result).

Тест:

?- get_list_below_line([(4,4), (3,4), (2,4), (1,4)], 3, ResultList).
ResultList = [(2, 4),  (1, 4)] ;
false.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...