错误:在当前环境中找不到引用fst

时间:2017-10-08 16:25:12

标签: coq

我正在编写一个小程序,以便我可以使用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

2 个答案:

答案 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 *)