私は、本体を書き直したい機能を持つ目標を持っていますが、 いくつかの関数引数が書き換えの途中にあります。 アイデンティティ関数を使って状況を再現しました。Coq機能の拡張性
機能がDefined
であれば、それは動作しますが、機能 はパラメータであり、私が書き換えする方法を述べる公理を持っているとき、私は書き換えることができ ありませんよ。
機能的な拡張性を前提として動作させることができます。 機能的な拡張性を前提としないで何とか書き直すことは可能ですか?
Axiom functional_extensionality: forall {A B} (f g:A->B) , (forall x, f x = g x) -> f = g.
Variables A B : Type.
Variable f : A -> B.
Definition Id (x : B) := x. (* here my function is Defined *)
Goal (fun x => Id (f x)) = f. (* I'd like to rewrite inside the fun *)
Proof. auto. Qed. (* This works (eta reduction). *)
Variable Id' : B -> B. (* Here I don't have the function definition *)
Axiom ID : forall x, Id' x = x. (* only proof that it does the same thing *)
Goal (fun x => Id' (f x)) = f.
Proof.
rewrite ID. (* this doesnt work *)
eauto using functional_extensionality, ID. (* but this works *)
しかし、公理 'forall x、Id 'xを使って'(fun x => Id'(fx)) 'から'(fun x => fx) 'に左辺を書き換えることができないのはなぜですか? = x'?それはどんな種類の不一致を引き起こす可能性がありますか? – larsr
問題は、Coqの理論が書き換えを実行するほど強力ではないということです。これは矛盾を引き起こすものではありません。なぜなら、機能的な拡張性を安全に使うことができるからです。私は少し私の答えを更新します。 – ejgallego