ハスケルでかなりの経験をして、私はちょうど定理証明のためにIdrisを使い始めました。これは、単純なステートメントを証明しようとしたときに直面した問題を示す最小限の例です。代替案の注文に依存する関数に関する証明
たちが総機能test
持って考えてみましょう。もちろん
total test : Integer -> Integer
test 1 = 1
test n = n
を、私たちは関数がtest n = n
に単純化することができていることがわかりますが、のは、それを証明してみましょう。
total lemma_test : (n : Integer) -> test n = n
lemma_test 1 = Refl
lemma_test n = Refl
しかし、これは型チェックしません:私は単純にすべてのケースの上につもりです
Type mismatch between
n = n (Type of Refl) and
test n = n (Expected type)
Specifically:
Type mismatch between
n
and
test n
ので、問題はイドリスはlemma_test
の第二のケースのために推測することができないということのようですn
は1
と等しくなく、test
の2番目のケースも適用する必要があります。
Integer
のためのケースのように私たちは、もちろん、面倒な、または不可能であることができる、明示的にすべてのケースを一覧表示しようとすることができます:
total lemma_test : (n : Integer) -> test n = n
lemma_test 1 = Refl
lemma_test 2 = Refl
lemma_test 3 = Refl
...
このようなステートメントを証明する方法はあります有限集合のデータコンストラクタ上で定義されていないが、この例ではtest
のようなパターンマッチングが上から下に作用するという事実に依存する関数に対して、
多分、このような機能が非常に頻繁に起こると考えて、私が見逃している単純な解決策があるかもしれません。
"デフォルト"のパターンマッチについて何かを証明することは不可能であるか少なくとも困難であるという情報は、私にとって非常に役に立ちます。ありがとうございます。あなたが提案したように、決定的な平等を使用するために私の具体的な問題に適応することができると思います。 –