- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Coq 的 SSReflect 扩展中发现了两个约定,它们看起来特别有用,但我还没有在较新的依赖类型语言(Lean、Agda、Idris)中看到它们被广泛采用。
首先,在可能的情况下,谓词被表示为返回 bool 值的函数,而不是归纳定义的数据类型。这在默认情况下带来了可判定性,为通过计算证明提供了更多机会,并通过避免证明引擎携带大量证明项来提高检查性能。我看到的主要缺点是在证明时需要使用反射引理来操纵这些 bool 谓词。
其次,具有不变量的数据类型被定义为包含简单数据类型和不变量证明的依赖记录。例如,固定长度序列在 SSReflect 中定义如下:
Structure tuple_of : Type := Tuple {tval :> seq T; _ : size tval == n}.
seq
并且证明该序列的长度是某个值。这与例如Idris 定义了这种类型:
data Vect : (len : Nat) -> (elem : Type) -> Type
seq
定义的许多函数并且关于它们的证明仍然可以用于
tuple
(通过对底层
seq
进行操作),而使用 Idris 的方法,函数类似于
reverse
,
append
等需要为
Vect
重写.精益实际上在其标准库中具有等效的 SSReflect 样式,
vector
,但它也有一个 Idris 风格的
array
这似乎在运行时有一个优化的实现。
Vect n A
样式方法是一种反模式:
A common anti-pattern in dependently-typed languages and Coq in particular is to encode such algebraic properties into the definitions of the datatypes and functions themselves (a canonical example of such approach are length-indexed lists). While this approach looks appealing, as it demonstrates the power of dependent types to capture certain properties of datatypes and functions on them, it is inherently non-scalable, as there will be always another property of interest, which has not been foreseen by a designer of the datatype/function, so it will have to be encoded as an external fact anyway. This is why we advocate the approach, in which datatypes and functions are defined as close to the way they would be defined by a programmer as possible, and all necessary properties of them are proved separately.
最佳答案
我可以提供关于第一点的一些想法(将谓词定义为返回 bool 值的函数)。我对这种方法的最大问题是:那么根据定义,函数不可能有错误,即使结果它计算的不是你想要计算的。在许多情况下,如果您必须在其定义中包含谓词的决策过程的实现细节,它也会模糊您对谓词的实际含义。
在数学应用中,如果您想定义一个谓词,该谓词是一般不可判定的事物的特化,即使它恰好在您的特定情况下是可判定的,也会出现问题。我在这里谈论的一个例子是用给定的表示定义组:在 Coq 中,定义它的一种常用方法是 setoid,底层集合是生成器中的形式表达式,以及由“word”给出的等式等价”。通常,这种关系是不可判定的,尽管在许多特定情况下是可判定的。但是,如果您仅限于定义具有可判定词问题的表示的组,那么您将无法定义将所有不同示例联系在一起的统一概念,并无法对有限表示或有限表示组进行一般性证明。另一方面,将单词等价关系定义为抽象Prop
或等价物很简单(如果可能有点长)。
就我个人而言,我更喜欢先给出最透明的谓词定义,然后在可能的情况下提供决策过程(返回 {P} + {~P}
类型的值的函数在这里是我的首选,尽管返回 bool 值的函数也能很好地工作)。 Coq 的类型类机制可以提供一种方便的方式来注册这样的决策过程;例如:
Class Decision (P : Prop) : Set :=
decide : {P} + {~P}.
Arguments decide P [Decision].
Instance True_dec : Decision True := left _ I.
Instance and_dec (P Q : Prop) `{Decision P} `{Decision Q} :
Decision (P /\ Q) := ...
(* Recap standard library definition of Forall *)
Inductive Forall {A : Type} (P : A->Prop) : list A -> Prop :=
| Forall_nil : Forall P nil
| Forall_cons : forall h t, P h -> Forall P t -> Forall P (cons h t).
(* Or, if you prefer:
Fixpoint Forall {A : Type} (P : A->Prop) (l : list A) : Prop :=
match l with
| nil => True
| cons h t => P h /\ Forall P t
end. *)
Program Fixpoint Forall_dec {A : Type} (P : A->Prop)
`{forall x:A, Decision (P x)} (l : list A) :
Decision (Forall P l) :=
match l with
| nil => left _ _
| cons h t => if decide (P h) then
if Forall_dec P t then
left _ _
else
right _ _
else
right _ _
end.
(* resolve obligations here *)
Existing Instance Forall_dec.
关于coq - 为什么较新的依赖类型语言没有采用 SSReflect 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49477427/
我在 gobject 上阅读了一个维基百科页面,上面写着, Depending only on GLib and libc, GObject is a cornerstone of GNOME and
如何注册一个依赖属性,其值是使用另一个依赖属性的值计算的? 由于 .NET 属性包装器在运行时被 WPF 绕过,因此不应在 getter 和 setter 中包含逻辑。解决方案通常是使用 Proper
我一直在尝试将 ActionbarSherlock maven 依赖项添加到我的项目中 com.actionbarsherlock library 4.2.0 在我的 po
http://tutorials.jenkov.com/ood/understanding-dependencies.html#whatis说(强调我的): Whenever a class A us
我对所有这些魔法有点不清楚。 据我了解,依赖属性是从 DependencyObject 继承的,因此存储值: 如果分配了值(在本地字典中),则在实例本身中 或者如果未指定值,则从指向父元素的链接中获取
我刚刚更新了在 ASP.NET Framework 4.5.2 版上运行的 MVC Web 应用程序。我正在使用 Twilio 发送 SMS 消息: var twilio = new TwilioRe
我刚刚发现了一件令人生畏的事情。 spring 依赖坐标有两个版本。 项目依赖于 spring mvc 和 spring flow。有两组并行的依赖项。 Spring MVC 具有以下方案的依赖项
我正在尝试包含 的 maven 依赖项 org.jacorb jacorb 2.3.1 依赖已解决,但它导致另一个依赖 picocontainer 出现问题: [ERROR
我正在尝试在 Haskell 项目中包含特定版本的库。该库是住宿加早餐型的(用于 martix 操作),但我需要特定的 0.4.3 版本,该版本修复了乘法实现的错误。 所以,我的 stack.yaml
有谁知道如何制作依赖的 UIPickerView.例如,当我选择组件一的第 2 行时,组件二的标题会发生变化吗? 我在互联网上查找过,没有真正的答案,我尝试过使用 if 和 switch 语句,但它们
我正在编写一个用于验收测试的项目,由于各种原因,这依赖于另一个打包为 WAR 的项目。我已成功使用 maven-dependency-plugin 解压 WAR,但无法让我的项目包含解压的 WEB-I
或多或少我在 session 上大量构建我的网站(特别是重定向用户等),我很好奇这是否是一种危险的做法。禁用浏览器 cookie 保存的用户的大致比例是多少?我愿意接受任何建议:) 谢谢 最佳答案 s
开始玩 Scala futures,我被依赖的 futures 困住了。 让我们举个例子。我搜索地点并获得 Future[Seq[Place]]。对于这些地点中的每一个,我搜索最近的地铁站(该服务返回
或多或少我在 session 上大量构建我的网站(特别是重定向用户等),我很好奇这是否是一种危险的做法。禁用浏览器 cookie 保存的用户的大致比例是多少?我愿意接受任何建议:) 谢谢 最佳答案 s
我有一个二进制文件,需要一些 *.so 文件才能执行。现在,当我尝试在一些旧机器上执行它时,它会显示 /lib/libc.so.6: version `GLIBC_2.4' not found 如何将
我尝试使用 Dygraph 来表示图表,我在 https://github.com/danvk/dygraphs 中找到了代码,但是它有太多的依赖文件,我觉得很烦人。是否有一个文件可以容纳所有必需的
我正在处理一个 javascript 文件,该文件 a) 声明一个具有函数的对象,并且 b) 使用它期望在外部声明的散列调用该对象的 init 函数。我的 Jasmine 规范提示它找不到哈希,因为它
最近我一直在学习 Angular 并且进展顺利,但是关于依赖注入(inject)的一些事情我仍然不清楚。 是否有任何理由在我的 app.js 文件中声明我的应用程序的其他部分(服务、 Controll
考虑一个名为 foo 的表,它有 id (PRIMARY & AUTO_INCREMENT) 列。我正在向该表中插入一行,挑战从此时开始。 $db->query("INSERT INTO `foo`
我正在使用级联下拉 jquery 插件。 (https://github.com/dnasir/jquery-cascading-dropdown) 我有两个下拉菜单。 “客户端”和“站点”。 根据您
我是一名优秀的程序员,十分优秀!