Пролог списков списков получить все элементы - PullRequest
0 голосов
/ 26 мая 2018

У меня есть списки списков:

decide([[1,2,-3],[-2,3],[6],[4]],K). 

Я хочу вернуть все возможные решения, нажав «;».

Правило состоит в том, чтобы сначала возвращать значения, размер списка которых равен 1.

Затем я хочу вернуть значения, размер которых больше 1.

size([],0).
size([_|Xs],L) :- size(Xs,N),L is N+1.

head([],[]).
head([X|_],X).

return_list_members([X|_], X).
return_list_members([_|T], X):-return_list_members(T, X).


decide([], []).
decide([L|Ls], Lit):- size(L, N), N == 1, head(L, Lit).
decide([L|Ls], Lit):- size(Ls, N), N == 0, head(L, Lit), !.
decide([L|Ls], Lit):- decide(Ls, Lit) ,return_list_members(Ls, Lit)

Пример того, каким должен быть результат:

? - decide([[1,2,-3],[-2,3],[6],[4]],K).
K = 6 ;
K = 4 ;
K = -2 ;
K = 3 ;
K = -3 ;
K = 2 ;
K = 1.

Моя цель - вернуть сначала список только с одним значением.Затем верните все остальные списки, один за другим.В форме у меня есть код, который возвращает только первый элемент списка, потому что у меня есть главный вызов.Как мне вернуть не только головные ценности, но и все остальные, и без репетии?Я пытался создать функцию для возврата всех элементов списков.

Есть предложения?

1 Ответ

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

Принимая ваш другой вопрос в качестве отправной точки, просто введите свои новые требования:

listoflist_member(Xss, X) :-
   ( Xs = [_] ; Xs = [_,_|_] ),           % new
   member(Xs, Xss),
   member(X, Xs).
...