ID と構成を提供するクラスを定義しようとしています。他の便利なインスタンス (nil と連結を含むリスト; ID と合成との関係 ;-) ) に加えて、関数のインスタンスが必要です。
与えられた
Class Cat (C0 : Type) (C1 : C0 -> C0 -> Type) :=
{ identity : forall a, C1 a a
; compose : forall {a b c : C0}, C1 b c -> C1 a b -> C1 a c
(* snip: some laws *)
}.
のようなものを定義できるようにしたい
Instance Cat (->) := { ... }.
しかし、Coq の演算子はそのようには機能しません。最初->
は表記だと思いLocate "_ -> _".
ましたが、これはUnknown notation
. ちょっとうまくいきfun a b => a -> b
ますが、後で型がおかしく見えます。
> Check (identity nat).
identity nat
: (fun a b : Type => a -> b) nat nat
(同じことが にEval compute in
も当てはまります。型を単純化していないようです。)より読みやすいidentity nat : nat -> nat
. (現在、私がやっていることの型は読めなくなります。)
「生」を取得する方法、->
または少なくともCoqにもっと良い型を与えるよう説得する方法はありますか?
補足: 私はInductive
評価セマンティクスを表す多くの を構築しています。私の目標は、「通常の」プログラミング言語のサブセットを Coq にマッピングして戻し、セキュリティ制約を転送し、魔法をかけることです。私は同じことを異なるコンストラクターで何度も何度も証明することを余儀なくされています。これにより、一度だけ証明できるようになることを願っています。カテゴリはこれを抽象化する正しい方法だと思います。私が間違っている場合に備えて、このメモをここに含めます->
。問題全体を回避するより良い方法があるかもしれません。