列表中的序言列表
Prolog list within list
我在尝试创建包含多个子列表的列表时遇到了一些问题。我不明白为什么我的代码没有按预期工作。
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 行的列表。任何人都可以看到为什么以及我做错了什么吗?我对序言还很陌生。
我想这就是你想要的
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)。
给定一个长度为 L 的列表,你如何递归构造一个长度为 TL 的列表?
您将长度为 L 的列表附加到长度为 1 的列表,并尝试从我们的新长度 L+1 列表构建长度为 TL-1 的列表。
作为基本情况,您知道要从长度为 TL 的列表构建长度为 TL 的列表,您只需要按原样 return 列表。
您的谓词 return 是一个更大的列表,由每个长度为 Length
的 Stopcond 较小列表组成。
递归地,A bigger-list of length Stopcond 是一个较小的 Length 元素列表附加到一个较大的长度 Stopcond-1 列表。
基本情况:大小为 0 的 bigger-list 只是一个空列表。
如果我们只考虑 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
我在尝试创建包含多个子列表的列表时遇到了一些问题。我不明白为什么我的代码没有按预期工作。
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 行的列表。任何人都可以看到为什么以及我做错了什么吗?我对序言还很陌生。
我想这就是你想要的
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)。
给定一个长度为 L 的列表,你如何递归构造一个长度为 TL 的列表? 您将长度为 L 的列表附加到长度为 1 的列表,并尝试从我们的新长度 L+1 列表构建长度为 TL-1 的列表。 作为基本情况,您知道要从长度为 TL 的列表构建长度为 TL 的列表,您只需要按原样 return 列表。
您的谓词 return 是一个更大的列表,由每个长度为 Length
的 Stopcond 较小列表组成。
递归地,A bigger-list of length Stopcond 是一个较小的 Length 元素列表附加到一个较大的长度 Stopcond-1 列表。
基本情况:大小为 0 的 bigger-list 只是一个空列表。
如果我们只考虑 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