将术语解释为Coq中的类型
我正在从自然自下而上构建整数,并尝试直接应用态射重写,而不是将其添加为setoid态射,因为在我的情况下,这样做很难且不自然,但测试用例失败,出现以下错误:将术语解释为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
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重写。对,我必须提供一个证明,我不理解这一点。不错的回答