2016-11-09 83 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行的列表。任何人都可以看到为什么和我做错了什么?我对prolog很陌生。

回答

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). 

什么是您的断言尝试做(不考虑三要素的子列表现在)? 它将长度为Stopcond的列表附加到传递的第二个参数(List)。

你如何递归地构造一个长度为TL的列表给定一个长度为L的列表? 您将长度为L的列表附加到长度为1的列表中,并尝试从我们的长度为L + 1的新列表构造一个长度为TL-1的列表。 作为基本情况,您知道要从长度TL列表构造长度TL列表,您只需按原样返回列表。

您的谓词返回一个更大的列表,其中包含每个长度为Length的Stopcond小列表。 递归地,长度更大的列表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

谢谢!这正是我正在尝试的,我会开始评论我自己的代码! –