2012-03-21 22 views
-3

私は行列M x Nを持っているので、インデックス付き[1,N][M,N]の要素の場所を切り替える必要があります。プロローグタスクの解決策を書く

更新

私はプロローグには本当に新しいですが、ここで返す私の解決策である偽:(

main([FirstRow|Tail],X):- 
    last(FirstRow, A), 
    last(Tail, LastRow), 
    last(LastRow, B), 
    skipLastItem(FirstRow,FirstRowWithoutA), 
    skipLastItem(LastRow,LastRowWithoutB), 
    append(FirstRowWithoutA,[B],FirstRowNew), 
    append(LastRowWithoutB,[A],LastRowNew), 
    assign([FirstRowNew],X), 
    skipLastItem(Tail,Middle), 
    appendAllElements(Middle,X), 
    append(X,LastRowNew,X). 

appendAllElements([X|Tail],List):- 
    append(List,X,NewList), 
    appendAllElements(Tail,NewList). 

appendAllElements([],_). 

assign(Item,Item). 

skipLastItem([_],[ ]) :- !. 
skipLastItem([H|T],[H|S]) :- 
skipLastItem(T,S). 
+4

解決方法を最初に書いて、問題が発生した場所を教えてください。 –

+2

私は、はい、誰かがプロローグであなたの問題に対する解決策を書くことができると予測します。 –

+0

私はあなたに解決策を提供しました。 – Eugene

答えて

3

これは宿題のように聞こえるので、私はここに少し曖昧になるだろうよ...リスト内の一つの値を交換する単純な問題で

スタート。再帰的な述語を書く

swap_list(X,N,A,B,Y) 

"リストXの場合はN、値Aを削除してBに置き換えるとY"となります。

これを行列の場合に拡張することができます。第再帰述語「行列Y元素Aを除去し、Bに置き換える、位置(M、N)、行列Xのために与える」として読まれるべきである

swap_matrix(X,M,N,A,B,Y) 

を書きます。この再帰の基底の場合、M=0にはswap_listの呼び出しが含まれます。

さて、あなたは次のように二つの位置(M1、N1)および(M2、N2)を入れ替えることができます。私たちもそれが何であるかを知っている前に、私たちが行列ZBを挿入

swap(X,M1,N1,M2,N2,Y) :- 
    swap_matrix(X,M1,N1,A,B,Z), 
    swap_matrix(Z,M2,N2,B,A,Y). 

注 - Bは第2のswap_matrixが呼び出されるまで値が割り当てられません。

関連する問題