List
標準ライブラリの理論には非常によく似た関数があります。その関数は引数として述語、つまりf
要素型から への関数を取り、一致する要素が見つかった場合、または見つからなかった場合bool
に戻ります。Some x
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.
特定の object と等しい要素を探していますa
。つまり、述語はeq_Interface a
であり、eq_Interface
は に対して必要な等式ですInterface
。
等値の定義が多数存在する可能性があるため、型に等値関数を定義するのはあなた次第です。Coq は=
、ライプニッツの等式である を定義しています。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.
Interface_dec
引数が等しいかどうかを示すだけでなく、引数が等しいか異なるかの証明も付属しています。
その等価関数を取得したらfind
、標準ライブラリ関数に関して関数を定義できます。
Definition Interface_is_in x := if List.find (Interface_eq x) then true else false.