GNU Пролог модификация powerset

Итак, я получил это для powerset:

powerset([], []).
powerset([H|T], P) :- powerset(T,P).
powerset([H|T], [H|P]) :- powerset(T,P).

Это создает все наборы списка. Можно ли генерировать все наборы в порядке списка.

Пример:

List = [a,b,c]

я хочу получить

[a],[a,b],[a,b,c],[b],[b,c],[c]

Заметки нет [a,c] в этом списке подмножеств, так как это подмножества, начинающиеся слева и идущие вправо.

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

Благодарю.

4 ответа

Решение

Как насчет

powerset(L, [H|T]):-
  append([H|T], _, L).
powerset([_|L], P):-
  powerset(L, P).

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

Несколько дней назад я пытался реализовать powerSet/2 предикат, без использования встроенного предиката bagof/2, но даже с bagof/2 а также setof/2 это не очень простая проблема для начинающих (создание всех подмножеств раздельно является еще одной проблемой и намного проще). поэтому после внедрения решения я подумал, что лучше поместить его здесь, чтобы не допустить ошибок людей, которые ищут эту тему.

Мое решение (без bagof/2)

генерировать (X, [Y], [[X| Y]]).

генерировать (X, S, P):-
        S = [H| Т],
        добавить ([X], H, Temp),
        генерировать (X, T, Rest),
        Добавить ([Temp], Отдых, P),!

powerSet([], [[]]).

powerSet(Set, P):-
        Set = [H| Т],
        powerSet(T, PsT),
        генерировать (H, PsT, Ps),
%       write('пытаюсь нажать'), print(H), write(' to '),
%       write('все элементы powerset of '), print(T), write(' which is '),
%       print(PsT), нл,
%       write('and result is'), print (Ps), nl, nl,
        добавить (Ps, PsT, P),!

код будет понят, если проконсультироваться с закомментированными строками.

другое решение доступно здесь, который использует встроенный предикат bagof/3,

вероятно, это было бы более полезно сейчас.

Вы хотите все подпоследовательности подстрок ( определение). Грамматики (DCG) лучше всего подходят для этого:


seq([]) -->
   [].
seq([E|Es]) -->
   [E],
   seq(Es).

... --> [] | [_], ... .

?- Es = [_|_], phrase((..., seq(Es), ...), [A,B,C]).
Es = [A] ;
Es = [A, B] ;
Es = [A, B, C] ;
Es = [B] ;
Es = [B, C] ;
Es = [C] ;
false.

(SWI-Пролог)

Как насчет этого:

powerset(A,B):-
    append(A,_,B);
    append(_,A,B).

test():-
    setof(X,powerset(X,[1,2,3]),L),
    writeln(L).
Другие вопросы по тегам