- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Coq 让我定义这个:
Definition teenagers : Set := { x : nat | x >= 13 /\ x <= 19 }.
还有:
Variable Julia:teenagers.
但不是:
Example minus_20 : forall x:teenagers, x<20.
或:
Example Julia_fact1 : Julia > 12.
这是因为 Julia(青少年类型)无法与 12(nat)进行比较。
问:我应该如何通知 Coq Julia 的支持类型是 nat 以便我可以写任何关于她的有用信息?
Q':我对青少年的定义似乎是一个死胡同;它的陈述性多于建设性的,而且我似乎已经失去了nat 的归纳特性。我怎样才能显示它的居民?如果没有办法,我还是可以坚持nat,用Prop和函数。 (这里是新手,用 Pierce's SF 自学不到一周)。
最佳答案
您在 teenagers
中使用的模式是“subType”模式的一个实例。正如您所注意到的,{ x : nat | P x }
不同于nat
.目前,Coq 提供很少的支持来有效处理这些类型,但如果您限制为“行为良好”的类 P
,您实际上可以以合理的方式工作。 [这真的应该成为 Coq FAQ 顺便说一句]
从长远来看,您可能希望对该模式使用特殊支持。 math-comp 库提供了此类支持的一个很好的例子 subType
界面。
描述这个界面超出了你最初的问题,所以我将以一些评论结束:
在你的minus_20
例如,您想使用青少年数据类型的第一个投影。尝试 forall x : teenagers, proj1_sig x < 20
.如果您将投影声明为 Coercion
,Coq 可以尝试自动插入此类投影。 :
Require Import Omega.
Definition teenagers : Set :=
{ x : nat | x >= 13 /\ x <= 19 }.
Coercion teen_to_nat := fun x : teenagers => proj1_sig x.
Implicit Type t : teenagers.
Lemma u t : t < 20.
Proof. now destruct t; simpl; omega. Qed.
正如您正确观察到的那样,{ x : T | P x }
在 Coq 中与 x
不同.原则上,您不能从 T
类型的对象转移推理。到 { x : T | P x }
类型的对象因为您还必须另外推理类型为 P x
的对象.但对于广泛的类 P
, 你可以证明 teen_to_nat
投影是单射的,即:
forall t1 t2, teen_to_nat t1 = teen_to_nat t2 -> t1 = t2.
然后,可以将对基类型的推理转移到子类型。另请参阅:Inductive subset of an inductive set in Coq
[编辑]:我在 math-comp 中添加了几个典型的子类型示例,因为我认为它们很好地说明了这个概念:
n.-tuples
.长度为 n 的列表在 math-comp 中表示为一对单个列表加上大小证明,也就是说 n.-tuple T = { s : seq T | size s == n}
.由于单射性和强制性,您可以在元组上使用所有常规列表函数,并且它们工作正常。'I_n = { x : nat | x < n }
与自然数几乎相同,但有界限。关于coq - 处理 `{ x : nat | x >= 13/\x <= 19 }` 形式的(子)类型的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37897316/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!