1
我刚开始使用Coq。Coq:关于一组内容的命题
我该如何定义命题myProp
这样给定一个集合H
,myProp H
是真的iff ?
特别是,我该如何表达一个事实:H
是nat
的子集?或者我怎么能简单地说让H是nat的一个子集?
我刚开始使用Coq。Coq:关于一组内容的命题
我该如何定义命题myProp
这样给定一个集合H
,myProp H
是真的iff ?
特别是,我该如何表达一个事实:H
是nat
的子集?或者我怎么能简单地说让H是nat的一个子集?
你是在类型理论中,所以子集的概念并不完全以集合论的方式存在于 中。
将某些事物描述为nat的子集只是通过将其描述为自然数的命题来完成的。某种类型的nat -> Prop
。
句子让H
是NAT一个子集写的是:
Variable H : nat -> Prop.
现在对自然数谓语只能应用于自然数。
如果你想有一致性和谈论自然数的全部子集,它是由(随机选择的名称)
Definition all_nat n := True.
将注意力转向你的myProp
谓语表示的,它只会被应用关于自然数的谓词,所以你可以删除有关作为nat子集的部分,这将始终得到满足。
Definition myProp (H : nat -> Prop) := forall x, H (2 * x) -> H x.
如果我真的想有以下的初步建议的说明,我会写
Definition myProp' (H : nat -> Prop) :=
(forall x, H x -> all_nat x) /\
(forall x, H (2 * x) -> H x).
但相合的第一部分是在all_nat
的情况下,真没用。在其他情况下,您可能想要考虑另一个有意义的nat子集的所有子集。
非常感谢。我刚开始使用Coq,所以我错过了一些背景知识。 – lodo
你也可以使用Ensembles库来提供一些包装。例如'定义myProp(A:Ensemble nat):Prop:= forall n:nat,In _ A(2 * n) - > In _ A n。' –
我不喜欢Ensemble库的一个特性,公理。我不想公布它。 – Yves