Распечатать список внутри вложенного списка, который содержит элемент - PullRequest
0 голосов
/ 03 мая 2018

У меня следующая проблема.

Мне дано listOfLists, значение (строка, столбец), и мне нужно получить список внутри списка, который содержит это определенное значение, вплоть до индекса моего значения внутри этого списка.

Например

?- find_list([[(1,2),(1,3),(1,4)], [(2,2),(2,3),(2,4)]], (1,3), List2).
List2 = [(1,2),(1,3)].

Моя проблема в том, что если я использую member / 2, я получу значение true или false, только если мое значение находится внутри listOfList или нет, а не списка, с которым мне нужно будет работать.

Как я могу получить этот список, в котором есть мое значение?

1 Ответ

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

Имеет ли значение, что значения являются двумерными координатами? Есть ли на них порядок, который вы должны соблюдать, или это просто порядок элементов в списке? Я возьму на себя последнее.

Если вы хотите разделить список в какой-то момент, обычно стоит использовать стандартный предикат append/3. Например, предположим, что мы хотим сократить список [a, b, c, d, e] на префикс, содержащий элементы до c, и суффикс, содержащий элементы после c. Вот как это делается:

?- append(Prefix, [c | Suffix], [a, b, c, d, e]).
Prefix = [a, b],
Suffix = [d, e] ;
false.

Здесь c исключен из префикса, но это легко исправить:

?- append(Prefix, [c | Suffix], [a, b, c, d, e]), append(Prefix, [c], UpToAndIncludingC).
Prefix = [a, b],
Suffix = [d, e],
UpToAndIncludingC = [a, b, c] ;
false.

Мы можем дать этому предикату красивое имя:

list_pivot_prefix(List, Pivot, Prefix) :-
    append(Prefix0, [Pivot | _Suffix], List),
    append(Prefix0, [Pivot], Prefix).

И ваш предикат find_list/3 затем просто находит все списки в данном списке списков, для которых выполняется это отношение:

find_list(Lists, Element, Prefix) :-
    member(List, Lists),
    list_pivot_prefix(List, Element, Prefix).

Вот ваш тестовый пример:

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