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).