Пролог - вернуть список уникальных чисел во вложенных списках - PullRequest
0 голосов
/ 15 февраля 2019

Привет всем, я пытаюсь самостоятельно изучить Пролог, и я застрял, пытаясь создать функцию, которая принимает вложенный список и возвращает список только уникальных чисел.Таким образом, уникальный (L, T) означает, что T - это список уникальных чисел, извлеченных из L.

Формат списков выглядит следующим образом, где за c всегда следует int:

[a,[b,[c,5],[c,3]],[c,4]]

Пример того, что должно возвращаться как истина:

unique([b,[c,4],[c,3]], [4,3])

Это код, который я пробовал, однако он просто возвращает пустой список, когда я пытаюсь его запросить:

unique([],[]).
unique([X|XS],[X|L]) :-
 integer(X),
 unique(XS,L).
unique([X|XS],L) :-
 \+integer(X),
 unique(XS,L).

Я пробовал и другие решения и, похоже, получаю пустой список в качестве вывода или просто 'false'.Буду признателен за любые указания на этот счет!

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Свести список, отфильтровать его, чтобы получить числа, отсортировать, чтобы сделать их уникальными:

?- L = [a,[b,[c,5],[c,3]],[c,4]], flatten(L, F), include(number, F, N), sort(N, Unique_numbers).
L = [a, [b, [c, 5], [c, 3]], [c, 4]],
F = [a, b, c, 5, c, 3, c, 4],
N = [5, 3, 4],
Unique_numbers = [3, 4, 5].

Если вы хотите сохранить исходный порядок, вы не можете отсортировать, но есть много ответов на SOкоторые показывают вам, как это сделать.

Если вы не хотите использовать предикаты библиотеки, посмотрите, как они определены (flatten/2 и include/2), и найдите вдохновение для своего собственного решения.

0 голосов
/ 15 февраля 2019

Этот код не учитывает, что списки являются вложенными;он должен преуспеть (например):

unique([b,c,4,c,3],[4,3]).

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

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