Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Prolog > Генерация k-элементных подмножеств:чуть подправить


Автор: Dux987 3.12.2008, 00:38
Одна из стандартных задач - генерировать все K-элементные подмножества из множества {1,2,...,N}. N и K вводятся пользователем.

есть набросок (Tinefol):

subset(K, N):- subset([ ], 0, K, N).

subset(Generated, Len, K, N):-
    Len < K,
    int(Elem, N), 
    not(member(Elem, Generated)),
    NewLen is Len + 1,
    subset([Elem | Generated], NewLen, K, N).
subset(Set, Len, K, _) :-
    Len = K,
    write(Set).

int(N, N):- % Генератор числа в диапазоне от 1 до указанного во втором аргументе
    N >= 1.
int(K, N):-
    N >= 1,
    M is N - 1,
    int(K, M).

member(E, [E | _]). % Предикат принадлежности множеству
member(E, [_ | T]):-
    member(E,T).

Но такая программа при запросе ?-subset(2,5) например, выдаёт ошибку - предикат subset возможно не определён.

Как правильно написать секцию predicates? Как написать, что параметром предиката является список? Спасибо заранее))

Добавлено через 6 минут и 28 секунд
также жалуется на то, что не определено Generated в subset(Generated, Len, K, N). Как его ввести?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)