2015-10-26 4 views
0

Я пытаюсь, чтобы все мои C в том же списке,Прологе список элементов в списке

Как:

?- channels(C,3). C = [[1, 2], [1, 3], [2, 3]] ;

но то, что я получаю это:

?- channels(C,3). C = [[1, 2]] ; C = [[1, 3]] ; C = [[2, 3]] ;

Мой код:

channels([C],N) :- range(1,N,L), combination(2,L,C). 


range(I,I,[I]). 
range(I,K,[I|L]) :- I < K, I1 is I + 1, range(I1,K,L). 


combination(0,_,[]). 
combination(K,L,[X|Xs]) :- K > 0, 
    el(X,L,R), K1 is K-1, combination(K1,R,Xs). 

el(X,[X|L],L). 
el(X,[_|L],R) :- el(X,L,R). 

Пожалуйста, помогите мне

+1

Пожалуйста, приложите больше усилий, чтобы заявить, что вы хотите. В настоящее время все догадки – false

+0

Глядя на желаемый результат и ваш фактический результат, я думаю, что это будут «каналы (LC, N): - findall (C, (диапазон (1, N, L), комбинация (2, L, C)), LC). – gusbro

+0

Да, извините, но ваше решение сработало, поэтому вы поняли его так, как должны, но большое вам спасибо. – VHdk

ответ

0

Глядя нужную мощность и ваш фактический выход, это выглядит, как вы хотите, чтобы собрать все решения combination(2, L) с L в диапазоне от до N:

Таким образом, вы можете использовать findall/3 для этого:

channels(LC,N):- 
    findall(C, 
    (range(1,N,L), 
    combination(2,L,C) 
    ), LC). 
Смежные вопросы