我正在编写一个小程序,以便我可以使用HoTT书籍(等人)中的类型引入/消除规则来处理deMorgans法则的一些证明。我的模型/示例代码全部在此https://mdnahas.github.io/doc/Reading_HoTT_in_Coq.pdf。到目前为止,我有,
Definition idmap {A:Type} (x:A) : A := x.
Inductive prod (A B:Type) : Type := pair : A -> B -> @prod A B.
Notation "x * y" := (prod x y) : type_scope.
Notation "x , y" := (pair _ _ x y) (at level 10).
Section projections.
Context {A : Type} {B : Type}.
Definition fst (p: A * B ) :=
match p with
| (x , y) => x
end.
Definition snd (p:A * B ) :=
match p with
| (x , y) => y
end.
End projections.
Inductive sum (A B : Type ) : Type :=
| inl : A -> sum A B
| inr : B -> sum A B.
Arguments inl {A B} _ , [A] B _.
Arguments inr {A B} _ , A [B].
Notation "x + y" := (sum x y) : type_scope.
Inductive Empty_set:Set :=.
Inductive unit:Set := tt:unit.
Definition Empty := Empty_set.
Definition Unit := unit.
Definition not (A:Type) : Type := A -> Empty.
Notation "~ x" := (not x) : type_scope.
Variables X:Type.
Variables Y:Type.
Goal (X * Y) -> (not X + not Y).
intro h. fst h.
现在我真的不知道问题所在。我是使用定义的人的例子,但他们总是涉及"计算"命令,我想将规则fst应用于h来获取x:X,因此它们没有帮助。
我试过"申请fst。"这让我
Error: Cannot infer the implicit parameter B of fst whose type is
"Type" in environment:
h : A * B
答案 0 :(得分:3)
在证明上下文中,Coq希望执行策略,而不是要评估的表达式。由于fst
未定义为策略,因此会Error: The reference fst was not found in the current environment.
按照您似乎要尝试的方式执行的一种可能的策略是set
:
set (x := fst h).
答案 1 :(得分:3)
我想将规则fst应用于h以获得x:X
我相信你可以做到
apply fst in h.
如果你只是写apply fst
,Coq会将fst
规则应用于目标,而不是h
。如果你写fst h
,正如丹尼尔在答案中所说,Coq会尝试运行fst
策略,而这种策略并不存在。除了Daniel的set
解决方案之外,如果fst h
出现在其中会改变目标(这可能是您想要的也可能不是),以下内容也可以使用:
pose (fst h) as x. (* adds x := fst h to the context *)
pose proof (fst h) as x. (* adds opaque x : X to the context, justified by the term fst h *)
destruct h as [x y]. (* adds x : X and y : Y to the context, and replaces h with pair x y everywhere *)