- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下两个命题很容易证明。
Theorem nat_eq_nat : nat = nat.
Proof.
trivial.
Qed.
Theorem True_neq_False : ~(True = False).
Proof.
unfold not.
intros.
symmetry in H.
rewrite H.
trivial.
Qed.
但是当我试图证明一个稍微不同的命题 ~(nat = False)
时,我发现重写策略不起作用。它报告
Error: Refiner was given an argument "fun x : Set => x" of type "Set -> Set" instead of "Set -> Prop".
所以我试着写一个引理。
Lemma Type_eq_prod : forall (a : Type) (b : Type), a = b -> (a -> b).
Proof.
intros.
rewrite <- H.
trivial.
Qed.
Theorem nat_neq_False : ~(nat = False).
Proof.
unfold not.
intros.
apply (Type_eq_prod nat False) in H.
inversion H.
apply 0. (*no subgoals left*)
到目前为止一切正常。但是当我尝试Qed它时,它报告了
Error: Illegal application (Type Error):
The term "Type_eq_prod" of type "forall a b : Type, a = b -> a -> b"
cannot be applied to the terms
"nat" : "Set"
"False" : "Prop"
"H" : "nat = False"
"0" : "nat"
The 3rd term has type "nat = False" which should be coercible to
"nat = False".
以下是另外两个让我卡住的命题。
Theorem nat_neq_bool : ~(nat = bool).
Proof.
unfold not.
intros.
Abort.
Theorem nat_neq_true : ~(nat = True).
Proof.
unfold not.
intros.
Abort.
我的问题是:
1.Why the rewrite tactic doesn't work with proposition ~(nat = False).
2.Why can't I Qed it when there is no subgoals.
3.How to prove the aborted propositions above or is it possible to prove or prove the negates of them in coq.
最佳答案
由于 Coq 处理其 Universe 的方式,重写策略不起作用,Prop
, Set
和 Type
.有一种包含的概念,它允许使用 Prop
好像它是一个 Set
或 Type
.这就是为什么你被允许写 nat = False
首先,因为平等只允许在相同类型的事物之间。问题在于,对于 Coq,False : Prop
不同于 False : Set
. not
用 False : Prop
定义,这意味着重写将产生不匹配,这解释了您收到的错误消息。
以下是可行的类似方法。注意对 Set
的显式强制.
Lemma nat_neq_False_2 : (nat = False) -> (False : Set).
Proof.
intros H.
rewrite <- H.
apply 0.
Qed.
Lemma nat_neq_False_3 : ~(nat = False).
Proof.
intros H.
destruct (nat_neq_False_2 H).
Qed.
当您使用策略编写证明时,Coq 本质上是在内部构建一个证明术语,但并没有真正对其进行类型检查。从这个意义上说,它有点像元编程。一旦你点击 Qed
,由策略构建的术语被发送到类型检查器以确保它是正确的。大多数时候,策略会产生正确的证明,但每隔一段时间就会发现不被接受的证明,您的案例就是一个例子。
打印的错误信息不是很清楚,但是可以通过使用命令 Set Printing All
更好地了解发生了什么。 ,这会导致 Coq 打印所有没有符号的术语和语句,并显示隐含的参数。这就是您的错误消息在执行此操作时的样子:
Set Printing All.
Lemma Type_eq_prod : forall (a : Type) (b : Type), a = b -> (a -> b).
Proof.
intros.
rewrite <- H.
trivial.
Qed.
Theorem nat_neq_False : ~(nat = False).
Proof.
unfold not.
intros.
apply (Type_eq_prod nat False) in H.
inversion H.
apply 0. (*no subgoals left*)
Qed.
(* Error: Illegal application (Type Error): *)
(* The term "Type_eq_prod" of type "forall a b : Type, @eq Type a b -> a -> b" *)
(* cannot be applied to the terms *)
(* "nat" : "Set" *)
(* "False" : "Prop" *)
(* "H" : "@eq Set nat False" *)
(* "O" : "nat" *)
(* The 3rd term has type "@eq Set nat False" which should be coercible to *)
(* "@eq Type nat False". *)
在那里,我们可以看到问题是再次出现了全域不匹配:Type
中存在一个相等性。 , 而另一个在 Set
.有几种方法可以解决这个问题;最简单的可能是将您的第一个定理更改为:
Lemma Type_eq_prod : forall (a : Set) (b : Set), a = b -> (a -> b).
这两个命题在 Coq 中都是可证明的。在 Coq 的基础理论中,唯一可以证明简单类型如 nat
和 bool
不同的是基数论点。因此,nat <> bool
因为bool
只有两个元素,而 nat
不止于此。因此,通过证明 bool
有两个元素,一个可以重写等式nat = bool
找出 nat
也应该有两个元素,然后利用它来得到一个矛盾。类似的论点将表明 nat <> True
.
关于functional-programming - 如何在 coq 中证明 "~(nat = False)"、 "~(nat = bool)"和 "~(nat = True)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26550046/
(这不是关于定理证明,而是关于实践中的测试,例如 quickCheck) 让f一些通用函数 f :: RESTRICTIONS => GENERICS 具有一些“理想的”属性(即不是 hack,是不可
给定数组 arr 和索引数组 ind,以下算法就地重新排列 arr 以满足给定的索引: function swap(arr, i, k) { var temp = arr[i]; arr[i]
我有兴趣创建一个具有运行时间和空间限制的简单数组问题。看来我找到了解决问题的方法。请阅读以下java代码中问题的初始描述注释: /* * Problem: Given two integer ar
我是 isabelle 的新手,并试图证明以下简单的不等式: lemma ineq: "(a::real) > 0 ⟹ a 0 ⟹ b 0" proof have "1/a + 1/b >
是否有任何理论说缓存应该比文件系统更快? 我认为,由于文件系统也使用缓存,因此没有科学证据表明当文件系统的概念有些松散时,我们应该将内容从文件系统移动到诸如 memcache 之类的缓存中——比如下载
我正在做一个证明,我的一个子目标看起来有点像这样: Goal forall (a b : bool) (p: Prop) (H1: p -> a = b) (H2: p), neg
我有定义的归纳类型: Inductive InL (A:Type) (y:A) : list A -> Prop := | InHead : forall xs:list A, InL y (co
我知道 CRC 是一个线性函数,这意味着 CRC(x xor y) = CRC(x) xor CRC(y),但我不知道如何证明 CRC 的这个属性。 有谁有想法吗? 非常感谢! 最佳答案 这通常不是真
我是 Coq 的初学者。 虽然计算机为我验证了证明令人满意,但众所周知,满足 Coq 的证明对人类来说难以阅读。这是一个简单的例子,假设您没有看到任何评论: Theorem add_comm : fo
我试图了解是什么决定了类型参数是否必须是标称的。 虽然 GADT 和类型家族在某种意义上看起来不同,但它们不是“简单容器”,因为它们的实例定义可以“查看”它们的参数,但简单类型是否可以明显需要名义参数
我想使用 function 关键字定义来证明函数定义的正确性。以下是自然数的通常归纳定义上的加法函数的定义: theory FunctionDefinition imports Main begin
我定义了一个 Sygma-Type,如下所示: { R : nat -> nat -> bool | Reflexive R } 我有两个元素 r1 r2 : { R : nat -> nat ->
我有以下数据: new_pairs x y Freq start.latittude start.longitude start.station end.la
出于教育目的,我一直试图通过使用各种语言扩展和单例类型,在 Haskell 中重建《Type-Driven Development with Idris》(即 RemoveElem.idr )一书中的
我定义了一个 Sygma-Type,如下所示: { R : nat -> nat -> bool | Reflexive R } 我有两个元素 r1 r2 : { R : nat -> nat ->
我正在使用Ax DevTools,并且试图弄清楚如何使用相同的构建信息标记多个扫描。现在,我的测试运行如下: class MyTestCase : XCTestCase { func myTest
我正在尝试证明一个函数的正确性,该函数检查数组是否按递增/递减顺序排序或未排序。行为是返回 -1,如果按降序排序,1,如果按升序排序,大小为 1,或包含相同的值,0,如果没有已排序或为空。运行:Fra
我试图证明 Z3(Microsoft 的 SMT 求解器)中的一个归纳事实。我知道 Z3 通常不提供此功能,如 Z3 guide 中所述。 (第 8 节:数据类型),但是当我们限制要证明事实的域时,这
问题已编辑: 如代码中所述,HashSet 和 HashMap 是快速失败的(但这不是保证): void goHashSet() { Set set = new HashSet();
我试图使导航栏中的链接延伸到导航栏的全长。我环顾四周,发现了一些有用的信息,但无法使其正常工作 HTML: To
我是一名优秀的程序员,十分优秀!