Inductive ty: Set :=
| I
| O.
Definition f (x: ty) (y: ty): nat :=
if x = y then 0 else 1.
我想要的功能f
比較ty
類型的兩個方面,但它並不能編譯,我看到這個錯誤:如何比較Coq中相同Set的兩個元素(相等)?
The term
x = y
has typeProp
which is not a (co-)inductive type.
Inductive ty: Set :=
| I
| O.
Definition f (x: ty) (y: ty): nat :=
if x = y then 0 else 1.
我想要的功能f
比較ty
類型的兩個方面,但它並不能編譯,我看到這個錯誤:如何比較Coq中相同Set的兩個元素(相等)?
The term
x = y
has typeProp
which is not a (co-)inductive type.
你需要證明平等是可判定爲ty
(這是可以做到自動使用decide equality
),然後在if ... then ... else ...
語句中使用該定義。具體來說:
Inductive ty: Set :=
| I
| O.
Definition ty_eq_dec : forall (x y : ty), { x = y } + { x <> y }.
Proof.
decide equality.
Defined.
Definition f (x: ty) (y: ty): nat :=
if ty_eq_dec x y then 0 else 1.
您可以使用match
來感應數據類型的元素進行比較。
Definition f x y := match x,y with I, I | O, O => 0 | _,_ => 1 end.
decide equality
是一個更普遍的策略,並適用於無限集,但它是很好的知道,這是match
是做實際工作。
你可以通過注意到這個函數滿足所有xy,fxy = 0 <-> x = y在這種情況下可以很容易地證明這一點。 – Yves
你能告訴我更多關於{} + {}的信息嗎?我認爲它就像Proposition1或Prop2。但是這種方式不行。有沒有像他們分裂? – abhishek
@abhishek請參閱[sumbool](https://coq.inria.fr/library/Coq.Bool.Sumbool.html)。例如,更多解釋[本博客文章](http://seb.mondet.org/blog/post/coqtests-02-sumbools.html) – gallais