0

次のことを行う述語 (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=['$','$','$','','$','$','','','',''].
4

1 に答える 1

3

引数をループカウンターとして使用できるため、これは一種の良い問題です。引数はK、適切なインデックスを取得します。例として、リストをたどって特定のインデックスを見つけてみましょう。基本ケースは正しい要素にいるということであり、帰納的なケースは正しい要素の前にあることに注意してください。

traverse(1, [X|_], X).
traverse(N, [_|Xs], X) :- N > 0, N0 is N-1, traverse(N0, Xs, X).

そのパターンを適用してinsert_at/4、リスト内の適切な場所に到達します。今度は、新しいリスト L で XN 回繰り返す述語を書きましょうrepeat/3。今回の基本ケースは、必要なすべての繰り返しを追加したときであり、帰納的なケースは、別のインスタンスを追加することです。

repeat(1, X, [X]).
repeat(N, X, [X|Xs]) :- N > 0, N0 is N-1, repeat(N0, X, Xs).

この 2 つの構造の類似性を見ることができます。それらを単一の述語に結合してみてください。宿題なのでここまでにします。あなたはゴールから数インチです。

于 2013-06-06T19:55:56.363 に答える