次のことを行う述語 (vecLine2BitLine) を実装したいと思います: 2 つのリストと数値を取得します。最初のリストはブロックの長さ (ブロックの要素は '$') で、2 番目のリストにはこれらのブロックのインデックスが含まれています。次の意味に配置されます。
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: 述語をアクティブ化した後、結果の長さは 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 の長さであり、 「特殊文字」「*」のビットライン 3+2 をリストに挿入する必要がありますが、リストには 9-(3+2) の場所が残っているため''
、それらの場所を追加すると、次のようになります。
BitLine=['$','$','$','','$','$','','','',''].