2016-11-09 19 views
1

У меня есть некоторые проблемы, когда я пытаюсь создать список с несколькими подсписками. Я не понимаю, почему мой код работает не так, как ожидалось.Список прологов в списке

solves(_, _, 0, _). 
solves(Length, List, Stopcond, NList):- length(NL, Length), 
         append([NL], List, NList), 
         write(NList), nl, 
         N is Stopcond-1, 
         solves(Length, NList, N, NList2). 

?- solves(3, [], 3, B). 

Я хочу, чтобы B был списком с тремя подсписками, каждый с тремя переменными-специалистами. Когда я пишу NLIST, он показывает:

1. [[_G3207,_G3210,_G3213]] 
2. [[_G3222,_G3225,_G3228],[_G3207,_G3210,_G3213]] 
3. [[_G3237,_G3240,_G3243],[_G3222,_G3225,_G3228],[_G3207,_G3210,_G3213]] 
4. B = [[_G3207, _G3210, _G3213]] . 

Но я не понимаю, почему B становится только последний элемент списка. Я хочу, чтобы это был список в строке 3. Кто-нибудь может понять, почему и что я делаю неправильно? Я довольно новичок в прологе.

ответ

1

Я думаю, что это то, что вы намеревались

solves(_, List, 0, List). 
solves(Length, List, Stopcond, NList2):- length(NL, Length), 
         append([NL], List, NList), 
         %write(NList), nl, 
         N is Stopcond-1, 
         solves(Length, NList, N, NList2). 

Что делает ваш предикат попытаться сделать (Игнорирование 3 элемента подсписки на данный момент)? Он добавляет список длины Stopcond во второй переданный аргумент (List).

Как вы рекурсивно строите список длины TL Учитывая список длины L? Вы добавляете список длины L со списком длины 1 и пытаетесь построить список длины TL-1 из нашего нового списка длины L + 1. В качестве базового случая Вы знаете, что для построения списка длины TL из списка длины TL вам просто нужно вернуть список как есть.

Ваш предикат возвращает более крупный список, состоящий из меньших списков Stopcond длиной Length. Рекурсивно, более длинный список длины Stopcond - это меньший список элементов длины, добавленный к большому списку длины Stopcond-1. Базовый блок: больший список размером 0 - это просто пустой список.

Если бы мы были просто рассматривать 0 вместо данного элемента 3 подсписки,

solves(FinalList, 0, FinalList). % The result of appending a list of length 0 to the given list is the given list itself. 
solves(List, StopCond, FinalList):- % Appends A list of length StopCond to List 
    Length1List = [0], % Create a list of length 1 
    append(Length1List, List, LengthPlus1List), 
    N is N-1, 
    solves(LengthPlus1List, N, FinalList). 

Поскольку вы новичок, это могло бы помочь написать английские комментарии в отношении каждой строки.

% Base case: stopping condition satisfied. List is the final List we need 
solves(_, List, 0, List). 

% Recursive case: We need to make one more list of length L and append/prepend it to List 
solves(Length, List, Stopcond, NList2):- 
         length(NL, Length), % Create smaller-list of length Length 
         append([NL], List, NList), % Append it to the list we're building up 
         %write(NList), nl, 
         N is Stopcond-1, 
         solves(Length, NList, N, NList2). % Build Stopcond-1 more lists 
+0

Дайте мне минуту, я адаптирую объяснение в соответствии с вашим кодом. – 2bigpigs

+0

Спасибо! Это было точно, что я пытался, и я начну комментировать свой собственный код! –