正如标题所说,Coq可以用作模型检查器吗?我可以将模型检查与Coq证明混合使用吗?这通常吗?谷歌谈到"微积分",有没有人有这种或类似的经验?建议以这种方式使用Coq,还是应该寻找其他工具?
在处理我的编译器时,我遇到了这个错误:
Program received signal SIGSEGV, Segmentation fault.
__memcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S:33
Run Code Online (Sandbox Code Playgroud)
如何获取此处出现问题的详细信息?我从backtrace中知道它memcpy
是导致它的一条线,但是我如何看待内存是如何对齐的?我怎么知道它应该如何对齐?
该项目是一个带有LLVM后端的编译器,使用Zend/PHP运行时和OCaml垃圾收集器,因此有很多问题可能出错.
我怀疑这一行是问题的一部分:
zend_string *str = (zend_string *)caml_alloc(ZEND_MM_ALIGNED_SIZE(_STR_HEADER_SIZE + len + 1), 0);
Run Code Online (Sandbox Code Playgroud)
其中caml_alloc
分别pemalloc
在Zend源代码.
在执行10,000个字符串连接时会发生段错误.这是valgrind的输出:
==7501== Invalid read of size 8
==7501== at 0x4C2F790: memcpy@@GLIBC_2.14 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7501== by 0x4D7E58: subsetphp_concat_function (bindings.c:160)
==7501== by 0x4D7F52: foo (llvm_test.s:21)
==7501== by 0x4D7FA9: main (llvm_test.s:60)
==7501== Address 0x61db938 is 2,660,600 bytes inside a block of size 3,936,288 free'd
==7501== at 0x4C2BDEC: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) …
Run Code Online (Sandbox Code Playgroud) 阅读"类型和编程语言",我对使用闭包和记录子类型的对象实现印象深刻(第18章).是否有任何特殊原因OCaml不支持记录子类型(我知道对象确实如此)?事实上,我找不到任何支持这种语言的语言.
关于Haskell和Scala中的依赖类型有很多信息.对于OCaml,没有那么多.是否有足够的技术人员提供有关如何在OCaml中实现此目的的编码示例(如果可能的话)?当然(废弃的)Dependent ML,但似乎不可能将这些东西合并到"常规"OCaml代码中.
基本上,我想要做的是删除代码assert(n > 0)
,并在编译时检查它.
编辑
作为旁注,值得一提的是OCaml 混合合同检查分支,它可以满足依赖类型系统的一些需求.而不是assert(n > 0)
你会写一份合同:
contract f = {x : x > 0} -> int
let f x = x + 1
let dummy_variable = f (-1) (* Won't compile *)
Run Code Online (Sandbox Code Playgroud)
编辑2:对于读这篇文章的人来说,我认为F*是一种有趣的ML类语言,具有依赖类型.
无论出于何种原因,我都需要使用mendir和sedlex(utf-8),但是不知道如何使生成的解析器依赖Sedlexing
而不是Lexing
.有小费吗?
我跑的时候
menhir --infer parser.mly
Run Code Online (Sandbox Code Playgroud)
生成的程序有行Lexing...
.我可以手动更改它,但必须有另一种方式,不是吗?
在http://caml.inria.fr/cgi-bin/viewvc.cgi/ocaml/branches/中有很多有趣的OCaml分支.但是,我似乎无法找到有关这些功能的任何有用的信息.他们不是公开的吗?例如,README文件在所有分支中都是相同的.如何找到有关他们的更多信息(只是谷歌搜索将无济于事)?
在OCaml邮件列表上窃听人们之前,我想我可能会在这里发布我的问题.我刚发现这个美女(链接到Concoqtion网站).Concoqtion是MetaOCaml的扩展,它允许索引类型(可能还有更多).有了它,很容易创建列表,其中包括列表的长度:
type ('n:'(nat),'a) listl =
| Nil : ('(0),'a) listl
| Cons of let 'm:'(nat) in 'a * ('(m),'a) listl : ('(m+1),'a) listl
Run Code Online (Sandbox Code Playgroud)
这(m+1)
是在类型级别完成的.井井有条.
但是,最后一个版本是2007年(OCaml 3.08).有谁知道为什么这个项目被取消,或者今天OCaml有类似的东西?
我正在写一篇博客文章,介绍如何使用OCaml的模块系统而不是Java的OO系统(一个有趣的视角).我遇到过一些我不明白强迫的事情.下面是一个基本模块和两个包含它的模块:
module M = struct
type t = int
let make () = 1
end
module A = struct
include M
end
module B = struct
include M
end
Run Code Online (Sandbox Code Playgroud)
现在At和Bt是同一类型!为什么?如果你这样做,那就显而易见了
let a = A.make();;
let b = B.make();;
[a;b] --> A.t list (* ? *)
Run Code Online (Sandbox Code Playgroud)
我知道可以使用私有类型缩写来防止这种情况,然后如果要将它们放在同一个列表中则使用强制.我的问题是:为什么不这样做?编译器如何知道它A.t
并且B.t
来自相同的基类型?
关心
Olle
我需要一些帮助才能让js_of_ocaml正常工作.网上没有太多关于它的信息,手册非常稀疏(没有片段或用法示例,没有评论部分).
我Card
在服务器上有一个带有card
记录的模块.我正在card list
使用Ajax向客户端发送一个,我想阅读并遍历此列表.我最终得到的是:
let json = Json.unsafe_input (Js.string http_frame.XmlHttpRequest.content) in
Run Code Online (Sandbox Code Playgroud)
... 根据文档(当我运行它时,当然json
有类型'a
).
我可以记录json##length
并获得列表的正确长度.我从哪里开始?理想情况下,我想使用Deriving_Json
类型安全card list
再次获取,但我也可以使用for循环(不是优雅,但无论如何).
你如何解释归纳谓词?它们是做什么用的?他们背后的理论是什么?它们仅存在于依赖类型系统中,还是也存在于其他系统中?它们在某种程度上与 GADT 相关吗?为什么它们在 Coq 中默认为 true?
这是 Coq 的一个例子:
Inductive even : nat -> Prop :=
| even0 : even 0
| evens : forall p:nat, even p -> even (S (S P))
Run Code Online (Sandbox Code Playgroud)
你会如何使用这个定义?它是数据类型还是命题?