我想实现一个谓词(vecLine2BitLine),它执行以下操作: 获取两个列表和一个数字,第一个列表是块的长度(块的元素是'$'),第二个列表包含这些块应放在其中的索引:
vecLine2BitLine([1,2,1],[2,5,9],12,BitLine).
BitLine=[' ','$',' ',' ','$','$',' ',' ','$',' ',' ',' '].
说明:长度为1的块位于索引2处 并且长度为2的块在索引5处,依此类推..
insert_at_mul:插入一个元素N次(它工作正常,dupli和my_flatten之前已实现,所以我使用它们)
当N是列表X和Y的长度时,我一直试图激活insert_at_mul N次 在谓词vecLine2BitLine中。
dupli(L1,N,L2) :- dupli(L1,N,L2,N).
dupli([],_,[],_).
dupli([_|Xs],N,Ys,0) :- dupli(Xs,N,Ys,N).
dupli([X|Xs],N,[X|Ys],K) :- K > 0, K1 is K - 1, dupli([X|Xs],N,Ys,K1).
my_flatten(X,[X]) :- \+ is_list(X).
my_flatten([],[]).
my_flatten([X|Xs],Zs) :- my_flatten(X,Y), my_flatten(Xs,Ys), append(Y,Ys,Zs).
insert_at_mul(L,X,K,R,N):-dupli([X],N,XX) , insert_at(L,XX,K,L1) , my_flatten(L1,R).
get_num_spaces(L,N,X):-sum(L,S), X is N-S.
generate_spaces(N,L,X):- insert_at_mul(L,'',1,X,N).
vecLine2BitLineAux([],[],_,_,_).
vecLine2BitLineAux([X|Tail1],[Y|Tail2],N,L,Lnew):- insert_at_mul(L,'*',Y,Lnew,X) ,vecLine2BitLineAux(Tail1,Tail2,N,Lnew,R). // problem here!!!
vecLine2BitLine(X,Y,N,L):- get_num_spaces(X,N,Z) , generate_spaces(Z,[],ZZ) , vecLine2BitLineAux(X,Y,N,ZZ,L).
现在问题是在函数vecLine2BitLine中我无法激活insert_at_mul N次(这就是我在这段代码中尝试做的,但是失败了)。
如何修复vecLine2BitLine使其正常工作,如通过实际激活谓词insert_at_mul N次返回正确的输出? 谢谢! 补充道:
vecLine2BitLine:输入参数:(L1,L2,N,Result) N:激活谓词后,结果的长度为N.
L1:L1是一个数字列表,每个数字表示一个块的长度,一个块由一个'$'序列组成。
L2:L2是一个数字列表,数字是应该放置L1中的块的索引。
示例:
vecLine2BitLine([3,2],[1,5],9,BitLine).
我们可以更好地将输入视为元组:
vecLine2BitLine[(3,1),(2,5)],9,BitLine).
(3,1):在索引1处有一个''序列3次
(2,5):在索引5处有一个''序列2次
在我们的例子中,9是最后BitLine的长度,我们必须插入到
列出BitLine 3 + 2的“特殊字符”'*',但我们在列表中还剩下9-(3 + 2)个位置
所以我们在这些地方添加''
然后我们得到:
BitLine=['$','$','$','','$','$','','','',''].
答案 0 :(得分:3)
这是一个很好的问题,因为您可以将参数用作循环计数器。 K
参数可以使您获得正确的索引。让我们遍历列表并找到一个特定的索引作为示例。请注意,基本情况是您处于正确的元素,并且归纳的情况在正确的元素之前。
traverse(1, [X|_], X).
traverse(N, [_|Xs], X) :- N > 0, N0 is N-1, traverse(N0, Xs, X).
我们将该模式应用于insert_at/4
以到达列表中的正确位置。现在让我们编写一个repeat/3
谓词,在新列表L中重复XN次。这次基本情况是我们添加了我们关注的所有重复,并且归纳的情况是我们将添加另一个实例
repeat(1, X, [X]).
repeat(N, X, [X|Xs]) :- N > 0, N0 is N-1, repeat(N0, X, Xs).
你可以看到这两者之间结构的相似性。尝试将它们组合成一个谓词。由于这是家庭作业,我会在这里停下来。你离目标只有几英寸。