Morte/CoCに似た言語を使って、簡単な文there are lists of arbitrary lengths
を証明しようとしています。校正時のη変換問題を避けるために、無駄な `id`呼び出しで変数を囲むのは普通ですか?
∀ n:Nat ->
(ThereIs (List Nat)
(Equal Nat
(List.length Nat l)
n)))
ThereIs
依存ペア(シグマ)である。そのために、私は以下のタイプを書きました。すべて教会でコード化されています。それを証明するために、私は次の証明を書いた:変なふう
λ n:Nat ->
(ThereIs.this (List Nat)
(λ l:(List Nat) -> (Equal Nat (List.length Nat l) n))
(List.replicate Nat n Nat.Zero)
(Equal.refl Nat n))
を、私はd
(タイプナットのすなわち、自由変数)とλ c:* -> λ b:(c -> c) -> λ a:c -> (d c b a)
間の型の不一致エラーが発生します。しかし、それ以降の用語は、eta-reducedのときは、ちょうどd
です!それはn
、I「UN-ETA」のすべての出現にその役に立たないIDを適用することで、今
λ n: Nat ->
λ Nat:* ->
λ Succ: (Nat -> Nat) ->
λ Zero: Nat ->
(n Nat Succ Zero)
:私はETA-減速の準備ができていないので、私が代わりにこれ以下の「無用の識別」機能を作りました証明を検証させます。私はここで何が起こっているのかについて何らかの洞察を得たいと思います。この "役に立たない"機能は、校正を書く上で知られている/使用されているパターンですか?なぜこのような助けを借りずに、この証明をタイプチェックすることができないのですか?この現象の背後に深い推論があるのでしょうか、それとも特別な理由がないかですか?
あなたはアルファではない、つまり右ですか? –
ありがとう@ReidBarton – MaiaVictor
私は、すべての品種の特別にタイプされた 'id'は、唯一のイコールではなく、証明システムでは非常に一般的だと思います。 Coqの戦術の半分は、特にエキサイティングな方法で綴られた「id」に翻訳されてしまいます。 –