[英]Coq - use Prop (True | False) in if … then … else
我是Coq的新手。
我正在尝试实现插入排序的通用版本。 我正在实现的是将Comparator作为参数的模块。 此Comparator实现比较运算符(例如is_eq,is_le,is_neq等)。
在插入排序中,为了插入,我必须比较输入列表中的两个元素,并根据比较结果将元素插入到正确的位置。
我的问题是比较运算符的实现是type -> type -> prop
(我需要它们像这样实现其他类型/证明)。 如果可以避免,我宁愿不创建type -> type -> bool
版本的运算符。
有没有办法转换True | False
在if ... then ... else
子句中使用bool的True | False
支柱?
比较器模块类型:
Module Type ComparatorSig.
Parameter X: Set.
Parameter is_eq : X -> X -> Prop.
Parameter is_le : X -> X -> Prop.
Parameter is_neq : X -> X -> Prop.
Infix "=" := is_eq (at level 70).
Infix "<>" := (~ is_eq) (at level 70).
Infix "<=" := is_le (at level 70).
Parameter eqDec : forall x y : X, { x = y } + { x <> y }.
Axiom is_le_trans : forall (x y z:X), is_le x y -> is_le y z -> is_le x z.
End ComparatorSig.
自然数的实现:
Module IntComparator <: Comparator.ComparatorSig.
Definition X := nat.
Definition is_le x y := x <= y.
Definition is_eq x y := eq_nat x y.
Definition is_neq x y:= ~ is_eq x y.
Definition eqDec := eq_nat_dec.
Definition is_le_trans := le_trans.
End IntComparator.
插入排序的插入部分:
Fixpoint insert (x : IntComparator .X) (l : list IntComparator .X) :=
match l with
| nil => x :: nil
| h :: tl => if IntComparator.is_le x h then x :: h :: tl else h :: (insert x tl)
end.
(显然,插入修复点不起作用,因为is_le返回Prop而不是bool)。
任何帮助表示赞赏。
你似乎对Prop有点困惑。
is_le xy
是Prop类型,并且是x is less or equal to y
的语句。 这并不能证明这种说法是正确的。 这个陈述是正确的证据是p : is_le xy
,这种类型的居民(即该陈述的真相的证人)。
这就是为什么在IntComparator.is_le xh
上模式匹配没有多大意义。
更好的界面如下:
Module Type ComparatorSig.
Parameter X: Set.
Parameter is_le : X -> X -> Prop.
Parameter is_le_dec : forall x y, { is_le x y } + { ~ is_le x y }.
特别是, is_le_dec
的类型是属性is_le
的决策过程的is_le
,也就是说,它返回x <= y
的证明或~ (x <= y)
的证明。 由于这是一个带有两个构造函数的类型,因此您可以利用if
糖:
... (if IntComparator.is_le_dec xh then ... else ...) ...
从某种意义上说,这是一个强化的bool
,它会为它所要决定的东西返回一个见证。 有问题的类型叫做sumbool
,你可以在这里了解它: http : sumbool
通常,在执行代码时谈论True
或False
是没有意义的。
首先,因为它们存在于Prop
,这意味着它们在计算上Prop
,因为它们将被删除。
其次,因为他们不是Prop
的唯一居民。 虽然true
和false
是bool
类型的唯一值,这意味着你可以模式匹配,但Prop
类型包含无限数量的元素(你可以想象的所有语句),因此尝试和模式匹配是没有意义的。 Prop
类型的元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.