我想实现一个谓词(vecLine2BitLine),它执行以下操作:获取两个列表和一个数字第一个列表是块的长度(块的元素是'$'),第二个列表包含这些块应该的索引置于意义:
vecLine2BitLine([1,2,1],[2,5,9],12,BitLine).
BitLine=[' ','$',' ',' ','$','$',' ',' ','$',' ',' ',' '].
解释:长度为 1 的块在索引 2 处,长度为 2 的块在索引 5 处,依此类推..
insert_at_mul :插入一个元素 N 次(它工作得很好,dupli 和 my_flatten 以前实现过,所以我使用它们)
当 N 是谓词 vecLine2BitLine 中列表 X 和 Y 的长度时,我一直试图激活 insert_at_mul N 次。
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 次(这就是我在这段代码中尝试做的,但失败了)。
如何通过实际激活谓词 insert_at_mul N 次来修复 vecLine2BitLine 以使其正常工作,以返回正确的输出?谢谢!添加 :
vecLine2BitLine : 输入参数: (L1,L2,N,Result) N: 激活谓词 Result 后长度为 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=['$','$','$','','$','$','','','',''].