Все подмножество списка с k элементами в Прологе - PullRequest
2 голосов
/ 31 января 2012

Пожалуйста, помогите мне решить эту проблему:

подмножество (N, [1,2,3], L).

, если N = 2, яВы хотите получить результат:

[1,2];

[2,1];

[1,3];

[3,1];

[2,3];

[3,2];

(в любом порядке)

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

Я переписываю это решение: (на основе: Перестановочные комбинации элементов списка - Пролог )

subset(N, InList, Out) :-
    splitSet(InList,_,SubList),
    permutation(SubList,Out),
    length(Out, N).

splitSet([ ],[ ],[ ]).
splitSet([H|T],[H|L],R) :-
    splitSet(T,L,R).
splitSet([H|T],L,[H|R]) :-
    splitSet(T,L,R).

Результат (проверено в SWI-Prolog):

?- subset(2,[1,2,3],R).
R = [2, 3] ;
R = [3, 2] ;
R = [1, 3] ;
R = [3, 1] ;
R = [1, 2] ;
R = [2, 1] ;
false.
1 голос
/ 31 января 2012

Ну, ваш базовый случай тривиален:

subset(0,Lst,[]).

Если N> 0, у вас есть 2 варианта действий с первым элементом Lst:

  1. Вы можете игнорировать его и искать свое подмножество в том, что осталось от Lst
  2. . Вы можете включить его в свое подмножество, добавив его к тому, что вы получите для 1-меньшего подмножества того, что осталось от Lst.

Вы можете подумать, что вам нужно беспокоиться о том, чтобы Lst был слишком коротким (или N слишком большим: то же самое), но если вы правильно закодировали вышесказанное, об этом нужно позаботиться о вас.

Да, этого достаточно, чтобы начать.

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