基本的には、再帰算術でn - m
またはm - n
のいずれかがゼロに等しいことを証明したいと思います。これを達成するために、私は成功なしでrewrite ... in ...
パターンを使用しようとしています。Idrisの証明のためにタイプシグネチャの用語を書き換えるには?
以下は、基本コードである:最初の二つの穴
- + Main.hoyo1 [P]
`-- m : Natural
-----------------------------------------
Main.hoyo1 : AlgunoEsCero (resta C m) m
- + Main.hoyo2 [P]
`-- n : Natural
-----------------------------------------
Main.hoyo2 : AlgunoEsCero n (resta C n)
を検査する際
data Natural = C | S Natural
resta : Natural -> Natural -> Natural
resta a C = a
resta C b = C
resta (S a) (S b) = resta a b
data AlgunoEsCero : (n, m : Natural) -> Type where
IzquierdoEsCero : AlgunoEsCero C m
DerechoEsCero : AlgunoEsCero n C
alguna_resta_es_cero : (n, m: Natural) -> AlgunoEsCero (resta n m) (resta m n)
alguna_resta_es_cero C m = ?hoyo1
alguna_resta_es_cero n C = ?hoyo2
alguna_resta_es_cero (S n) (S m) = ?hoyo3
しかし、私は前方に移動することができた唯一の方法は、data AlgunoEsCero
に補題です。前方に私が読んだものから、方法は、ゼロになるだろう2のどちらマイナス指摘し、何かを持つデータ型を構築することは簡単だろうだから、
cero_menos_algo_es_cero : (m: Natural) -> resta C m = C
cero_menos_algo_es_cero C = Refl
cero_menos_algo_es_cero (S m) = Refl
のような別の定理を使ってタイプを書き換えることであろうrewrite cero_menos_algo_es_cero in IzquierdoEsCero
のように。しかし、それは吐き出す:
When checking right hand side of alguna_resta_es_cero with expected type
AlgunoEsCero (resta C m) (resta m C)
_ does not have an equality type ((m1 : Natural) -> resta C m1 = C)
すべてのリソースポインタがあります。 (タイプ駆動開発にも文書で良い点を見つけることができませんでした。多分、私は一般的にrewrite
/証明を誤解しています)
こんにちは、私はちょうど2番目の質問をしたいと思います。この変更をタイプチェックすると、証明は完了しましたか? –
あなたのソースファイルで '%default total'を使うか、関数とプルーフを' total'とマークする限りです。 –
または 'idris --check --total [source] .idr'? –