为了尽可能地隔离这个问题,假设我按如下方式开始Coq会话。
Parameter A : Type.
Parameter B : Type.
Parameter P : A -> B -> Prop.
Axiom existence : forall a : A, exists b : B, P a b.
Axiom uniqueness : forall a : A, forall b b' : B, P a b -> P a b' -> b = b'.
从这里开始,我想将函数f : A -> B
定义为P a (f a)
始终为真的唯一函数。
我该怎么做? 可以吗我这样做?显然我应该从像
这样的东西开始Definition f : A -> B.
intro a.
assert (E := existence a).
assert (U := uniqueness a).
...但我如何根据这些假设实际编写函数?
答案 0 :(得分:4)
我相信在你目前的环境中是不可能的。
问题在于你可以从existence
定理中提取b,但这只能存在于Prop
中。
因此,我相信您必须在A
中移动B
和Prop
,或在existence
中移动uniqueness
和Set
这将产生以下任何一种:
Parameter A : Prop.
Parameter B : Prop.
Parameter P : A -> B -> Prop.
Axiom existence : forall a : A, exists b : B, P a b.
Axiom uniqueness : forall a : A, forall b b' : B, P a b -> P a b' -> b = b'.
Definition f : A -> B.
intro a. destruct (existence a) as [b _]. exact b.
Defined.
Parameter A : Set.
Parameter B : Set.
Parameter P : A -> B -> Prop.
Axiom existence : forall a : A, { b : B | P a b }.
Axiom uniqueness : forall a : A, forall b b' : B, P a b -> P a b' -> b = b'.
Definition f : A -> B.
intro a. destruct (existence a) as [b _]. exact b.
Defined.
很可能这些都不是你想要的。在这种情况下,我需要更多细节才能提供帮助。可能是你愿意做一些在直觉主义背景下无法做到的事情。
PS:我不是专家。