将术语解释为Coq中的类型

将术语解释为Coq中的类型,coq,Coq,我正在从自然自下而上构建整数,并尝试直接应用态射重写,而不是将其添加为setoid态射,因为在我的情况下,这样做很难且不自然,但测试用例失败,出现以下错误: The term "x = x" has type "Prop" while it is expected to have type "x = x". The term "nat" has type "Set" while it is expected to have type "nat". 这也是由以下MRE引发的: Require

我正在从自然自下而上构建整数,并尝试直接应用态射重写,而不是将其添加为setoid态射,因为在我的情况下,这样做很难且不自然,但测试用例失败,出现以下错误:

The term "x = x" has type "Prop" while it is expected to have type "x = x".
The term "nat" has type "Set" while it is expected to have type "nat".
这也是由以下MRE引发的:

Require Import Setoid.

(* Custom natural Set *)
Parameter CNat : Set.

(* Addition *) 
Parameter CAdd : CNat -> CNat -> CNat. 
Infix "±" := CAdd (at level 50, left associativity).

(* Addition Morphism *)
Axiom cnat_add_morphism : 
  forall (x x' : CNat), x = x' ->
  forall (y y' : CNat), y = y' -> 
    x ± y = x' ± y'.

(* Test Example *)
Example cnat_add_inc : 
  forall (x y c : CNat), x = y -> x±c = y±c.
Proof.
  intros x y c CH.
  rewrite (@cnat_add_morphism x x (x=x) c c (c=c)). (* #Error *)

可以告诉
cnat_add_morphism
(在我的代码中,这是一个定理而不是公理)将术语
xαx
cαc
解释为一种类型以使morphism正常工作吗,或者使用另一种方法来应用手动态射重写,而不是将其添加为setoid?

您遇到的第一个问题是,要重写的术语类型不正确:

cnat_add_morphism x x (x¦x) c c (c¦c)
你有

cnat_add_morphism x x : x¦x -> forall y y', y¦y' -> x ± y ¦ x ± y'
因此,您需要提供
xαx
的证明,但您提供的是
xαx
本身。 实际上,您需要在系统中添加自反性的证明。差不多

Parameter CRefl : forall (x : CNat), x¦x.
然后你可以证明你的引理

Example cnat_add_inc : 
  forall (x y c : CNat), 
    x¦y -> 
    x ± c ¦ y ± c.
Proof.
  intros x y c CH.
  apply cnat_add_morphism.
  - assumption.
  - apply CRefl.
Qed.

您遇到的第一个问题是,您要重写的术语没有正确键入:

cnat_add_morphism x x (x¦x) c c (c¦c)
你有

cnat_add_morphism x x : x¦x -> forall y y', y¦y' -> x ± y ¦ x ± y'
因此,您需要提供
xαx
的证明,但您提供的是
xαx
本身。 实际上,您需要在系统中添加自反性的证明。差不多

Parameter CRefl : forall (x : CNat), x¦x.
然后你可以证明你的引理

Example cnat_add_inc : 
  forall (x y c : CNat), 
    x¦y -> 
    x ± c ¦ y ± c.
Proof.
  intros x y c CH.
  apply cnat_add_morphism.
  - assumption.
  - apply CRefl.
Qed.

这里有几个问题

首先,该错误意味着您试图给出一个命题,而不是该命题的证明。在Coq中,证明是它们所证明的命题类型的对象。例如,
对于all x:CNat,x¦x
是一个类型,您必须构建该类型的对象以确保该类型为真。这就像你有一个函数
f:nat->nat
,然后你写
f nat
,你会得到以下错误:

The term "x = x" has type "Prop" while it is expected to have type "x = x".
The term "nat" has type "Set" while it is expected to have type "nat".
您收到的错误与此完全相同。因此,您需要提供一个类型为“xаx”的对象,即保证命题
xаx
为真的证明。因此,您可以使用
ceq\u自反性
公理。术语
(ceq_自反性x)
的类型为
xαx
,您可以使用它来代替
xαx
的错误用法

(cnat_add_morphism x x (ceq_reflexivity x))
第二个,你需要应用引理,而不是重写引理,并使用假设而不是
xαx
(只使用x和y而不是x)


这里有几个问题

首先,该错误意味着您试图给出一个命题,而不是该命题的证明。在Coq中,证明是它们所证明的命题类型的对象。例如,
对于all x:CNat,x¦x
是一个类型,您必须构建该类型的对象以确保该类型为真。这就像你有一个函数
f:nat->nat
,然后你写
f nat
,你会得到以下错误:

The term "x = x" has type "Prop" while it is expected to have type "x = x".
The term "nat" has type "Set" while it is expected to have type "nat".
您收到的错误与此完全相同。因此,您需要提供一个类型为“xаx”的对象,即保证命题
xаx
为真的证明。因此,您可以使用
ceq\u自反性
公理。术语
(ceq_自反性x)
的类型为
xαx
,您可以使用它来代替
xαx
的错误用法

(cnat_add_morphism x x (ceq_reflexivity x))
第二个,你需要应用引理,而不是重写引理,并使用假设而不是
xαx
(只使用x和y而不是x)


我不想
应用cnat_add_morphism
,我想在左边应用
重写cnat_add_morphism
,如果我添加
cnat_add_morphism
作为setoid morphism(),这可以隐式完成。是的,我知道,但这不是你定义的问题,你想重写一些类型错误的东西。另外,现在您已经编辑了您的帖子以使用equality,这样
重写
就可以了。如果你想保留你自己的平等概念,那么你需要使用setoid重写。对,我必须提供一个证明,我不理解这一点。回答不错我不想
应用cnat_add_morphism
,我想在左边应用
重写cnat_add_morphism
,如果我添加
cnat_add_morphism
作为集形变形(),这可以隐式完成。是的,我知道,但这不是你定义的问题,你想重写一些类型错误的东西。另外,现在您已经编辑了您的帖子以使用equality,这样
重写
就可以了。如果你想保留你自己的平等概念,那么你需要使用setoid重写。对,我必须提供一个证明,我不理解这一点。不错的回答