2014-01-11 3 views
1
domains 
    el=integer 
    list = el* 
    lista = list* 

predicates 
    aux(list,integer,list) 
    arrangements(list,integer,lista) 
clauses 
    aux([H|_],1,[H]). 
    aux([_|L],N,L1):- 
     aux(L,N,L1). 
    aux([H|L],N,[H|L1]):- 
     N<>1, 
     N1=N-1, 
     aux(L,N1,L1). 
arrangements(L,N,R):- 
    findall(X,aux(L,N,X),R). 

Этот код показывает все комбинации элементов списка. Как мне изменить его, чтобы показать договоренности. У меня нет никаких идейУстройства элементов списка в прологе

механизмы

[2,3,4] K=2 => [[2,3], [3,2], [2,4], [4,2], [3,4], [4,3]] 

комбинаций

[2,3,4] K=2 => [[3,4], [2,3], [2,4]] 
+0

Вы говорите, что это «показывает все комбинации элементов», но хочет «показать договоренности». Можете ли вы пояснить пример? – lurker

+0

Я привел пример в вопросе – user3043278

+1

Ах, вы хотите перестановки из 3 вещей, взятых по 2 за раз. :) Если вы выполняете поиск в google в «прологовом перестановке», вы найдете кучу хорошей информации. Это можно сделать очень легко, используя предикат 'select/3'. – lurker

ответ

0

Используйте select в aux/3, чтобы получить какой-либо из перестановок из списка:

aux(L, N, [H|T]) :- 
    N > 1, 
    select(H, L, M), % Select an element "H" from "L", leaving "M" 
    N1 is N-1,   % NOTE the "is" here, not "=" !! 
    aux(M, N1, T).  % Recurse with remaining elements "M" and count-1 
aux(L, 1, [X]) :- member(X, L). 

arrangements(L, N, R):- 
    findall(X, aux(L, N, X), R). 

Результирующее в:

| ?- arrangements([2,3,4], 2, R). 

R = [[2,3],[2,4],[3,2],[3,4],[4,2],[4,3]] 

yes 
Смежные вопросы