为什么 coq 不对逻辑或使用子类型?
Why coq doesn't use subtyping for logical or?
这里所说的子类型化是指类型之间的隐式强制转换,而不是sig
。
在编程语言中,总和类型具有关联数据,并且使用哪种变体很重要,例如A
不能是 haskell 中 Either<A,B>
的子类型。可决定的 coq 也是如此。也就是说,A
一般不能是 A + B
的子类型,因为 A + A
比 A
.
多一位数据
但是,Prop
s 在运行时没有数据,所以为什么 coq 不认为 A
是 A \/ B
的子类型,并允许使用它的每个成员作为 A \/ B
的成员A \/ B
没有明确的 or_introl
?我认为它使证明更短、更通用。是否存在基本限制或不健全问题使其无法实现,或者它只是一个不需要的功能?
我认为主要问题确实是实用性之一:
如果您正在考虑证明 A\/B
,您可能不是在手动构建 A
或 B
的证明,而是应用一系列强大的技术不考虑效率和简洁性,正是因为你说的原因。
这意味着您可以使用强大的策略,例如 auto
或 intuition
,如果您运气好,甚至可以使用 firstorder
。
这些策略证明比 A -> A \/ B
多得多,并且经常执行许多步骤,包括那个,这使得强制有些无用(甚至可能令人困惑!)。
这里所说的子类型化是指类型之间的隐式强制转换,而不是sig
。
在编程语言中,总和类型具有关联数据,并且使用哪种变体很重要,例如A
不能是 haskell 中 Either<A,B>
的子类型。可决定的 coq 也是如此。也就是说,A
一般不能是 A + B
的子类型,因为 A + A
比 A
.
但是,Prop
s 在运行时没有数据,所以为什么 coq 不认为 A
是 A \/ B
的子类型,并允许使用它的每个成员作为 A \/ B
的成员A \/ B
没有明确的 or_introl
?我认为它使证明更短、更通用。是否存在基本限制或不健全问题使其无法实现,或者它只是一个不需要的功能?
我认为主要问题确实是实用性之一:
如果您正在考虑证明 A\/B
,您可能不是在手动构建 A
或 B
的证明,而是应用一系列强大的技术不考虑效率和简洁性,正是因为你说的原因。
这意味着您可以使用强大的策略,例如 auto
或 intuition
,如果您运气好,甚至可以使用 firstorder
。
这些策略证明比 A -> A \/ B
多得多,并且经常执行许多步骤,包括那个,这使得强制有些无用(甚至可能令人困惑!)。