Я думаю, что это то, что вы намеревались
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
Дайте мне минуту, я адаптирую объяснение в соответствии с вашим кодом. – 2bigpigs
Спасибо! Это было точно, что я пытался, и я начну комментировать свой собственный код! –