Haskell 98规范说,程序的入口点,即函数main
,应按惯例驻留在名为Main的模块中.但是,即使您没有module Main where
在您编写的文件的顶部写入main
,源代码也会编译,并且在您使用GHC时似乎正常工作.
问题是:
module Main where
和不写作有什么区别?我试着 通过形式化教自己Coq 形式化 我熟悉的数学定理:停止问题的不可判定性 可计算性理论中的各种定理.
由于我对形式化计算模型的细节不感兴趣(例如,图灵机,注册机,lambda calculi等),我试图通过 "教授Coq Church-Turing论文",即假设Axiom
s表示Coq认为可计算的函数的属性(即,可定义的类型函数nat -> nat
).
例如,如果我想告诉Coq有部分可计算函数的有效枚举,我可以说
Definition partial := nat -> nat -> option nat.
Axiom Phi : nat -> partial.
Run Code Online (Sandbox Code Playgroud)
这里,部分可计算函数被认为是(总)可计算函数,给定第一个参数s
,模拟s
许多步骤的原始部分可计算函数的计算.我还可以添加其他Axiom
s,如Padding Lemma,我可能能够证明停止问题的不可判定性,以及可计算性理论中的其他一些定理.
我的第一个问题是我到目前为止是否走在正确的轨道上.难道不是我正在尝试做的事情显然不可能出现不完整现象或Coq类型系统的性质吗?
我的第二个问题是关于相对化.如果我试图在可计算性理论中证明更严肃的事情,我会考虑在oracles中进行计算.由于oracles经常被构造为部分二值函数的极限,所以似乎(至少天真地)使oracles具有类型是自然的nat -> bool
.同时,为了使神谕变得不平凡,它们必须是不可计算的.考虑到这一点,具有类型的oracle是否nat -> bool
有意义?
这是关于oracles的另一个问题:如果对于每个oracle,存在相对于该特定oracle的部分可计算函数的类型,那将是非常好的.我可以通过在Coq中利用依赖类型系统来做到这一点吗?这种可能性是否取决于上文所述的一些形式化神谕的选择?
编辑:上面的方法肯定不能正常工作,因为我需要一个额外的公理:
Axiom Phi_inverse: partial -> nat.
Run Code Online (Sandbox Code Playgroud)
这应该不会成为预言真的.有没有像我上面描述的方法(我的意思是,那个不涉及计算模型形式化的方法)?
编辑:为了澄清我的意图,我编辑了上面的问题陈述.另外,为了呈现我想到的形式化的风格,我提出了一个不完整的证据,证明这里停止问题的不可解决性:
Require Import Arith.
Require Import Classical.
Definition ext_eq (A B : Set) (f g : A -> …
Run Code Online (Sandbox Code Playgroud) 您可以通过创建元组然后在匹配表达式中对其进行解构来对函数的多个参数进行模式匹配:
let f x y =
match x, y with
| pattern1 -> expr1
| ...
Run Code Online (Sandbox Code Playgroud)
或者,如果你不需要curried函数,你可以通过f
将一个元组作为唯一参数来实现:
let f (x, y) = function
| pattern1 -> expr1
| ...
Run Code Online (Sandbox Code Playgroud)
后一种方法的优点是每次定义函数时都不必编写两次参数.但是采用元组的函数似乎并不像curry那样受欢迎.
那么在OCaml社区中哪两个被认为是规范的或者首选的?
编辑:正如下面指出的垫,我的意思是let f = function blah blah
在第二个代码片段.
OCaml中,所述中缀运算符or
和&
被定义为同义词||
和&&
,RESP.我喜欢第一组操作员,因为它们更容易打字,他们让我觉得我正在学习与传统语言不同的东西.
不幸的是,or
和&
被标记为手册中弃用.我想知道
如果OCaml的设计者为这个设计决定写了一个理由,我想知道它的位置.我很感激你的帮助.
作为旁注,这是我的想法:
论点1. ||
并且&&
对C及其后代的前程序员更友好.
反驳论点1.OCaml在很少的方面与C类似.仅仅在这个特定的方面使它看起来像C是没有意义的.
论据2.更希望具有用于连接和分离的类似符号.
反驳论点2.在自然语言中,我们只有一个特殊的符号,并且,为了结合而不是为了分离,我们对它持续了几个世纪.此外,一些逻辑教科书,包括肖恩菲尔德的数学逻辑,使用完全不同的符号来分离和结合,即,和∨.
从语义上讲,Dalvik VM为每种方法都有一组新的寄存器,并且没有访问调用堆栈的指令.但就其实现而言,寄存器应以某种方式保存在方法调用上并在方法返回时恢复.Dalvik(谷歌的实施)如何做到这一点?
我正在尝试在OCaml中模拟纸牌游戏(为了简单起见,我们假设它是一个单人纸牌游戏).该游戏的给定状态由类型值表示game
.然后我将定义一个函数moves : game -> move list
,给出给定游戏状态的有效移动列表; 并且一个函数apply: game -> move -> game
在完成给定的移动后给出状态.(这里提供的类型实际上可能被多态的类型替换,如下所述.)
碰巧在这个游戏中有两种质量上不同的动作.在游戏的某些方面,需要决定是否出价.在游戏的其他方面,人们只需要打牌.它应该是适用的错误apply g
到m
那里g
需要一个(非)竞标移动和m
是一个打牌的举动,例如.
我希望这个错误是一个静态错误.所以我想到了使用GADT.我开始是这样的:
type card = int * int
type common = { cards : card list }
type play_phase = Play_phase
type bid_phase = Bid_phase
type _ game = Play_game : common -> play_phase game | Bid_game : common -> bid_phase game
type _ move =
| Play : card -> play_phase move …
Run Code Online (Sandbox Code Playgroud) 在引入可扩展变体类型之前,我参加了OCaml课程,我对它们了解不多.我有几个问题:
请注意,我的问题是关于可扩展的变体类型,特别是与建议的相同的问题(在引入EVT之前询问了这个问题!).
我试图通过重复平方对具有非常大模数的整数进行模幂运算(在我的情况下,功率总是2的幂,所以我相信这是最有效的方法).由于我的模数很好的属性,计算余数很便宜; 困难的部分是乘法.
目前我在Intel Core 2 Quad上运行GMP.我想有效地使用处理器的四个核心,但GMP不能在SMP环境中扩展,所以我正在寻找替代的任意精度算术库.我找到了一些用于矩阵并行计算的库,但我真正需要的是一个整数库.
我正在寻找的是什么?
为什么基于寄存器的虚拟机比基于堆栈的虚拟机更好?
具体来说,在Parrot VM的文档中,设计师解释了注册机的好处:
[...]高级语言中的许多程序由嵌套的函数和方法调用组成,有时使用词法变量来保存中间结果.在非JIT设置下,基于堆栈的VM将弹出,然后多次推送相同的操作数,而基于寄存器的VM将简单地分配适当数量的寄存器并对其进行操作,这可以显着减少操作量和CPU时间.
但为什么同样的操作数被推多次?
我一直在努力学习虽然原则上我喜欢异步防爆检查的主意,用伊莎贝尔2016年,我不喜欢伊莎贝尔/ jEdit的为许多原因,其中最严重的是,它使用了太多的内存(为了我).
如果我可以使用Isabelle 2016中的旧版Proof General,那就太棒了.我将变量设置isa-isabelle-command
为指向bin/isabelle
Isabelle分发目录下的文件.当我使用Proof General的菜单启动Isabelle时,Emacs挂起,当我打断它时C-g
,我在*isabelle*
缓冲区中得到以下内容.
> val it = (): unit
^BException- ERROR "Bad socket name: \"I\"" raised
Run Code Online (Sandbox Code Playgroud)
我知道这个站点上的旧帖子表明,Proof General用来与定理证明者通信的Isabelle组件被删除了.这是(仍然)Isabelle 2016的真实情况吗?如何在较新版本的Isabelle中使用Proof General?