Мне нужно сделать предикат, select(ListOfLists, X)
, который возвращает в качестве решения каждое другое число в списке списков, начиная с чисел, находящихся в списке отдельно, например:
select([[1,2,3],[1,2],[4],[3]],X).
Вернется:
X = 4 ;
X = 3 ;
X = 2 ;
X = 1
Порядок не имеет значения, пока числа, которые находятся в списке одни, отображаются первыми.
Для этого сначала я кодировал 2 других предиката:
%OrderedList is Lists ordered by size.
orderListsBySize(Lists, OrderedLists).
Пример: orderListsBySize([[1,2],[6],[3,4,5]], L).
-> L = [[6], [1,2], [3,4,5]]
И
%ListsWithoutX is Lists without the X elements
removeFromLists(X, Lists, ListsWithoutX).
Пример: removeFromLists(1,[[1,2],[3],[4,1,5]],L).
-> L = [[2],[3],[4,5]]
Оба предиката работают.
Затем, чтобы сделать предикат select(ListOfLists, X)
, я попробовал следующее:
select([[X|[]]|_], X). select(L1,S) :-
orderListsBySize(L1, [[X|XS]|LS]),
length(XS, A),
A == 0,
select([[X|[]]|M], S),
removeFromLists(X, [XS|LS], M).
select([[X|_]|_], X).
Но это не работает.
Это не сложное упражнение, которое можно выполнить на других языках.проблема в том, что мне все еще трудно понять, как работает пролог.Я ценю любую помощь, спасибо!