【问题标题】:Coq - use Prop (True | False) in if ... then ... elseCoq - 在 if ... then ... else 中使用 Prop (True | False)
【发布时间】:2012-12-21 02:30:46
【问题描述】:

我对 Coq 有点陌生。

我正在尝试实现插入排序的通用版本。我正在实现的是作为一个以比较器为参数的模块。该 Comparator 实现了比较运算符(如 is_eq、is_le、is_neq 等)。

在插入排序中,为了插入,我必须比较输入列表中的两个元素,并根据比较结果,将元素插入到正确的位置。

我的问题是比较运算符的实现是type -> type -> prop(我需要它们像这样来实现其他类型/证明)。如果可以避免,我宁愿不创建运算符的type -> type -> bool 版本。

有什么方法可以将 True | False 属性转换为布尔值以在 if ... then ... else 子句中使用?

比较器模块类型:

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)。

感谢任何帮助。

【问题讨论】:

    标签: coq


    【解决方案1】:

    你似乎对 Prop 有点困惑。

    is_le x y 是 Prop 类型,是语句 x is less or equal to y。这不能证明这种说法是正确的。证明此陈述正确的证据是 p : is_le x y,该类型的居民(即该陈述真实性的见证人)。

    这就是为什么在 IntComparator.is_le x h 上进行模式匹配没有多大意义。

    更好的界面如下:

    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 的决策过程的类型,即它返回x &lt;= y 的证明或~ (x &lt;= y) 的证明。由于这是具有两个构造函数的类型,因此您可以利用 if 糖:

    ... (if IntComparator.is_le_dec x h then ... else ...) ...

    从某种意义上说,这是一个增强的bool,它返回一个见证它试图决定的东西。有问题的类型称为sumbool,您可以在此处了解它: http://coq.inria.fr/library/Coq.Init.Specif.html#sumbool


    一般来说,在执行代码时谈论TrueFalse是没有意义的。

    首先,因为它们存在于Prop,这意味着它们不能与计算相关,因为它们将被删除。

    第二,因为他们不是Prop 的唯一居民。虽然truefalsebool 类型的唯一值,这意味着您可以进行模式匹配,但Prop 类型包含无限数量的元素(您可以想象的所有语句),因此它没有尝试对 Prop 类型的元素进行模式匹配是有意义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      • 2014-06-07
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      相关资源
      最近更新 更多