2017-11-22 28 views
0

私はちょうどプロローグの学習を開始し、リストに関連する問題を処理するのは難しいと思う。 私にリストがある場合。このリストの中には、3つの内部リストがあります。私は、Xが、私は(この文字は、内側のリストの最後の要素である必要があります移動したい文字である「移動(、に、RからL、X)」と呼ばれる述語を記述する必要がプロローグ:リスト間で要素を移動

[[a,b,c], [d,e,f],[h,g]] 

)、Fromは移動したいリストのインデックス、Toは移動したいリストのインデックスです。例えば

move([[a,b,c], [d,e,f],[h,g]], f, 2, 3, R). 

戻り

R = [[a,b,c], [d,e],[h,g,f]] 

もう一つの例:

move([[a,b,c], [d,e,f],[h,g]], f, 2, 1, R). 

戻り

R = [[a,b,c,f], [d,e],[h,g]] 

文字が最後の要素である場合、私は判断するためにヘルパー述語を書きましたリスト:

last([A], C):- A == C. 
last([_|T], C):- last_one(T, C). 

私はそれについて考えて数時間を過ごしたが、ない作業ソリューション。助けてください?

+0

与えられた要素が指定されたインデックスのリストに存在しない場合、またはいずれかのインデックスのリストが存在しない場合、述部は失敗するはずです。あるいは、指標が同じであれば?これは非常に明確な述語ではなく、Prolog-ish(本質的に必須)ですが、カウンタを追加するには補助述語が必要です。また、 'nth1/3'を使用する必要があります。 – lurker

+0

'A == C'は' A = C'でなければなりません。しかし、さらにうまくいって、 'last([A]、C): - A = C.'は' last([A]、A) 'で置き換えるのが最も良いでしょう。 – lurker

+0

あなたの述語は現在のカウントを調べます。その現在のカウントが "from"インデックスと一致する場合、その要素は現在のサブリストから削除されます。それ以外の場合、現在のサブリストは結果リスト内のサブリストと統合されます。現在のカウントが "to"インデックスと一致する場合、要素はresultサブリストに含まれます。あなたはそれに基づいて何かを考え出すことができるはずです。あなたはまた、決定しなければなりません:結果のサブリストで要素がどこに行くのですか、それとも重要ですか? – lurker

答えて

0

私はあなたが次のことを証明しなければならないと思う: move(L, X, From, To, R)は、実行したい述語なので、#1引数は、(サンプル中:L = [[a,b,c], [d,e,f],[h,g]])リストのリストです。 #3と#4の引数はLのメンバーです。したがって、述語nth1(N, L, E)を使用できます.Nは要素の次数、Lはリスト、Eは要素です。各要素は別のリストであり、今度はリストXからXを削除し、それをリストToに追加する必要があります。 これは、まず述語 'select/3'を使用できます。 2番目の場合は 'append/3'を使用できます。

私はfolowwingルールを試してみましたが、それは私のメインリストの異なる順序与える:このコードで

move(L, X, F, T, R) :- nth1(F, L, Lf), nth1(T, L, Lt), select(X, Lf, Rf), append(Lt, [X], Rt), select(Lf, L, Ra), select(Lt, Ra, Rb), append(Rb, [Rf], Rc), append(Rc, [Rt], R).

を、あなたは以下を得る:

move([[a,b,c], [d,e,f],[h,g]], f, 2, 3, R).

R = [[a,b,c], [d,e],[h,g,f]]

が、 :

move([[a,b,c], [d,e,f],[h,g]], f, 2, 1, R).

R = [[h,g], [d,e], [a,b,c,f]]

関連する問題