2017-10-08 15 views
0

私は6x6の数の行列を持っていて、特定の行、列または正方形の数値を与えるプロローグコードを書いています。例えば:プロローグの行列から正方形を生成する

0n 1n 2n 3n 4n 5n 
0n [[1,2,3,4,5,6] 
1n [2,3,4,5,6,1] 
2n [3,4,5,6,1,2] 
3n [4,5,6,1,2,3] 
4n [5,6,1,2,3,4] 
5n [6,1,2,3,4,5]] 

私はすでにのようなもので、行と列のコード、持っている:

row(1,[A|_],A). 
row(Y,[_|B],X) :- 
    Y-1 is Y1, 
    row(Y1,B,X). 

をしかし、今、私は3x3の四角を生成する方法についてこだわっています。私は座標を使って作業したいので、最初の引数は(1,3)のようなものでなければならず、行1nと列3nの2乗を与え、次に行列を2番目に、3番目の引数として正方形の数字を与えます。 誰にもヒントはありますか?私は再び頭の尾のパターンで作業しなければならないかもしれないと思っていた。与えられた行/列の最初の3つの数値を取得してから、これを3回実行しますが、これが可能で効果的かどうか、またはわかりません。

すべてのコメントをいただければ幸いです!

+0

最初のケースでもそのパターンで作業する必要はありません。 Prologには 'nth1/3'述語があります。 –

答えて

0

まず、行を取得するためにあなたの述語、安全ではありません。

row(1,[A|_],A). 
row(Y,[_|B],X) :- 
    Y-1 is Y1, 
    row(Y1,B,X). 

場合、私はrow(0,[1,4,2,5],X).それはすぐに無限ループにはまりますについて照会、場合に私はrow(2,[1,4,2,5]).でそれを動作します最初に私に正しい結果を与えてください。しかし、より多くの答えを探すときは、無限ループに入ります。

より良いアプローチは、次のようになります。

row(1,[A|_],A). 
row(Y,[_|B],X) :- 
    Y > 1, 
    Y-1 is Y1, 
    row(Y1,B,X).

Y > 1Yが言われていること1.

以下であればあなたは、あなたが再帰を実行しないであろうということがガードになりましたので、この述語を自分で作成する必要はありません。ほとんどのPrologインタプリタは既にそのような述語を持っています。nth1/3

ElemがのIndex番目の要素である場合はtrueです。

Iは、行の数、および J我々が望むの列の数である
elem(I,J,Matrix,Cell) :- 
    nth1(I,Matrix,Row), 
    nth1(J,Row,Cell). 

:1.

で 開始あなたはこの述語が存在すると仮定することができた場合は、使用することができますを数えます取ってくる。

存在しない場合は、述語の名前をnth1/3に変更することをお勧めします。

0からのカウントを開始する場合は、nth1/3の代わりにnth0/3を使用できます。

+0

ありがとうございました!したがって、あなたが書いた 'elem'述語は、I、J座標上の1つの数値を与えることになっています、そうですか? – Rose

+0

@Rose:正しい。しかし、あなたはそれを多方向に使うこともできます。'I''''''''''と' 'J'''のクエリのように' '3''などがあります。 –

関連する問題