標準ライブラリのList
理論には非常に類似した機能があります。この関数は、引数として述語をとります。つまり、要素タイプからbool
に関数f
を取り込み、x
が見つかった場合はSome x
、見つからない場合はNone
を返します。
Variable A : Type.
Fixpoint find (f:A->bool) (l:list A) : option A :=
match l with
| nil => None
| x :: tl => if f x then Some x else find tl
end.
特定のオブジェクトa
と等しい要素を探しています。つまり、あなたの述語がeq_Interface a
であることを意味します。よりも好きなことはeq_Interface
です。
等価の定義が多いため、型に等価関数を定義するのはあなた次第です。 Coqは=
と定義されています。これはLeibniz equalityです。区別する方法がない場合、2つの値が等しくなります。 =
は命題でありブール値ではありません。なぜなら、このプロパティは一般的に決定可能ではないからです。あるタイプでは必ずしも望ましい平等ではない場合もありますが、場合によってはより粗い等価関係が必要な場合もあります。したがって、2つのオブジェクトは異なる方法で構築されていても同じ意味を持ちます。
Interface
は、直観的には、組み込み命題のないデータ構造です。型定義から構造的等価関数を構築する組み込みの方法があります。リファレンスマニュアルでdecide equality
を参照してください。
Definition Interface_dec : forall x y : Interface, {x=y} + {x <> y}.
Proof. decide equality. Defined.
Definition Interface_eq x y := if Interface_dec x y then true else false.
だけでなく、その引数が等しいかどうかがわかりますが、また、引数が同じであることや、彼らが異なっていることの証明が付属しています。
あなたはその平等の機能を持っていたら、標準ライブラリ関数の面であなたのfind
関数を定義することができます:ご返信用
Definition Interface_is_in x := if List.find (Interface_eq x) then true else false.
感謝を。 Coqでのコーディング方法の問題です。 Iveは正しい再帰的定義を思いついた。 beq_nat関数がhttp://coq.inria.fr/stdlib/Coq.Arith.EqNat.html#beq_natにあるので、私は自分の別の等価関数をコード化する必要があることを認識しました。しかし、これはnat型の要素だけを比較します。私は最初に定義したタイプの "Interface"カスタムデータ型の要素を持っています。beq_nat: beq_nat(Interface1 i)(Interface2 i ')の場合はtrue、そうでない場合はfalseです。 – zdot
私はインターフェイスの定義を見せてもらえれば、それ以上の平等性を定義する方法を教えて助けてくれるかもしれません。 あなたは、上記の 'find'の定義をどのように修正すればよいでしょうか? – akoprowski