2011-02-03 22 views
1

行列が(正方形)下の三角形であるかどうかを調べる述語を書いています。1x1マトリックスに一致するパターンはどれですか?

考えは(インデックス0の要素を除く)行のすべての要素がすべてゼロであり、その後、が得サブマトリクスに再度述語を呼び出す場合を返すことです1行1列のを除きます。部分行列がちょうど1の数(例えば[[x]])であれば、再帰は終了するはずですが、もちろん下三角です。

質問:[x]にはどのように一致させることができますか?xは数字だけです。

lowertriangular (???) = True 
lowertriangular (x:xs) = all (==0) (tail x) && lowertriangular (map tail xs) 

編集

m = [[1,0,0],[2,-3,0],[4,5,6]] 

lt m = all (==0) [0, 0] && lt [[-3, 0], [5, 6]] 
    = all (==0) [0, 0] && (all (==0) [0] && lt [6]) 

LT [6] trueを返すこと[_]と一致しなければなりません。

答えて

5

[[x]]とパターン[[x]] - または[[_]]を使用して一致させることができます。これは、実際にはxの値を気にしないためです。私。

lowertriangular [[_]] = True 

は、1x1行列で呼び出されたときにtrueを返します。 1x1の行列はすでに完全にケースlowertriangular (x:xs) = ...によって処理されることに留意すべきであるので、あなたはそれらを明示的に処理するために必要はありませんしかし


。あなたが処理するために必要なのは、このように、あなたは空のリストを取得する場合です:

lowertriangular [] = True 
+0

:いいえ、私は使用している場合[ [_]]私は "関数lowertrinagularで非網羅的なパターン"を取得します。 – gremo

+4

@Gremo:リストが空の場合(つまり0x0行列)と一致しないため、これを取得します。しかし、あなたの質問は、1x1行列を扱う方法であり、これがその答えです。 – sepp2k

+0

Gremo:これはおそらく、内側のリストに1つの要素のほかに何かがあるからです(あなたは1つの要素のリストのリストに一致しています)。 sepp2kの答えはまだ有効ですが、他にも問題があります。 –

1

たぶん、これはあなたが探しているものです:sepp2k @

lowertriangular (x:[]) = True 
lowertriangular (x:xs) = all (==0) (tail x) && lowertriangular (map tail xs) 
+0

この実装では、 'lowertriangular [[1,0,0,0]、[1,1,0,0]、[1,1,1,0]、[1,1,1,1]]'結果は「真」になり、e。例えば、 'lowertriangular [[1,0,0,0]、[1,1,0,1]、[1,1,1,0]、[1,1,1,1]] '第2の行の最後の要素が「1」(ゼロでない)であるため、「False」となります。空の行列で呼び出されると 'False'を返します。 –

+0

@ sepp2k:あなたの '[]:xs'は' x:[] 'と同じですか? :/ –

+0

@ sepp2k:私はその問題に関して実践的な観点から考えていました:-)問題ではありません。 –

関連する問題