Questions tagged «program-verification»

给定规范,程序是否满足要求?

4
合同与依存类型之间的关系
我一直在阅读一些有关依赖类型和编程合同的文章。从我所阅读的大部分内容来看,似乎合同是动态检查的约束,而依赖类型是静态检查的。 有一些论文使我认为可以对合同进行部分静态检查: 混合类型检查(C. Flanagan-2006) 统一混合类型和合同(J.Gronski,C.Flanagan-2007) 这样,似乎有很多重叠,而我对合同和依存类型的分类就开始消失了。 在我所缺少的两个概念中,还有更深入的东西吗?还是这些只是代表相同基础概念的模糊类别?

1
如何确定证据是否需要“高阶推理技术”?
问题: 假设我有一个由公理和目标组成的问题的规范(即,相关的证明问题是给定所有公理,目标是否可满足)。我们还假设该问题在公理之间不包含任何矛盾/矛盾。有没有一种方法可以预先确定(即不先构建完整的证据)证明该问题将需要“高阶推理”? 所谓“高阶推理”,是指应用证明步骤,这些步骤要求将高阶逻辑记下来。“高阶推理”的一个典型示例是归纳法:原则上写下归纳方案需要使用高阶逻辑。 例: 一个人可以指定证明问题“两个自然数的加法是否可交换?” 使用一阶逻辑(即通过构造函数0 / succ与标准公理以及递归定义“加”函数的公理一起定义自然数)。要证明此问题,需要对“ plus”的第一个或第二个自变量的结构进行归纳(取决于“ plus”的确切定义)。在尝试证明它之前,例如通过分析输入问题的性质...,我是否已经知道这一点?(当然,这只是出于说明目的的一个简单示例-实际上,对于比“ +”的可交换性更困难的证明问题,这将是有趣的。) 更多背景信息: 在我的研究中,我经常尝试使用自动一阶定理证明者(例如Vampire,eprover等)来解决证明问题(或部分证明问题),其中有些可能需要更高阶的推理。通常,证明者需要相当多的时间才能提出证明(前提是存在仅需要一阶推理技术的证明)。当然,尝试将一阶定理证明者应用于需要高阶推理的问题通常会导致超时。 因此,我一直想知道是否有任何方法/技术可以提前告诉我,证明问题是否需要更高阶的推理技术(意思是“不要浪费时间试图将它交给一阶定理证明者”) )或不,至少可能是针对特定的输入问题。 我在文献中寻找问题的答案,并向定理领域的一些研究人员询问了有关这一问题的信息,但到目前为止,我还没有收到任何好的答案。我的期望是,有人尝试将交互式定理证明与自动定理证明结合在一起(Coq社区? 我想通常来说,我在这里概述的问题是不确定的(是吗?)。但是也许对问题的精炼版本有很好的答案...?

2
程序翻译的完全完整性与完全抽象
编译器验证工作通常归结为证明编译器完全抽象:它保留并反映(上下文)对等。 代替提供完全抽象样张,由长谷川[一些最近(分类基于)编译器核查工作1,2 ]和艾格等。等 [ 3 ]证明了各种CPS翻译的完全完整性。 问题: 完全完整性和完全抽象之间有什么区别? 在我看来,完整性就像翻译的对等反映,而完整性似乎是对等保存的结果。 注意:Curien [ 7 ]和Abramsky [ 8 ]都探讨了可定义性,完全抽象以及某种程度上完全完整性之间的关系。我怀疑这些资源可能可以回答我的问题,但经过表面阅读后,我尚未确认。 某些背景:Abramsky和Jagadeesan [ 4 ] 提出了“完全完整性”一词,用以描述乘法线性逻辑的博弈语义模型的正确性。 Blute [ 5 ]提供以下定义: 令FF\mathcal{F}为自由类别。我们说一个明确的模型 MM\mathcal{M}是全面完成 FF\mathcal{F}或者说我们有 充分完整性FF\mathcal{F}相对于MM\mathcal{M},如果,相对于发电机的一些解释,独特的无仿函数[[−]]:F→M[[−]]:F→M[\![ - ]\!] : \mathcal{F} \rightarrow \mathcal{M}已满。 据我所知,[ 6 ]中的长谷川是第一个采用完全完整性来描述程序翻译而不是分类语义模型的人。在这种情况下,吉拉德从简单类型的Lambda演算转换为线性Lambda演算。后来,在[ 1 ],他定义了CPS翻译的全完整性(⋅)∘(⋅)∘(\cdot)^\circ为: Γ∘;∅⊢N:(σ∘→o)⊸oΓ∘;∅⊢N:(σ∘→o)⊸o\Gamma^{\circ};\emptyset \vdash N : (\sigma^\circ \rightarrow o) \multimap oΓ⊢M:σΓ⊢M:σ\Gamma \vdash …

9
如何创建关键任务软件?
我正在自我学习形式方法。我听说使用(通常仅使用)正式方法来创建任务关键型软件(例如核反应堆控制器,飞机飞行控制器,空间探测器控制器)。这就是为什么我有兴趣学习它的原因:p 但是,在学习了形式化方法(尤其是LTL,CTL及其同级方法)之后,我觉得它们只能用于验证规范的正确性(安全性,活跃性,公平性等)。 但是,然后如何验证软件(不仅是规范)确实正确? 免责声明:在理论计算机科学方面,我是90%的白痴。因此,请在回答时保持仁慈。

2
Coq中OCaml的形式语义
几年前,欧文斯(Owens)在HOL 中将 OCaml的很大子集(称为OCamllight)的语义形式化。最近,Kreitz,Hayden和Hickey在Nuprl中实现了OCaml较小子集的类型理论语义。 Coq是否有类似的发展?

3
将终止降低到部分正确性有多难?
如果您熟悉程序验证,则可能更喜欢在“ 背景知识”之前阅读“ 问题 ” 。如果您不熟悉程序验证,那么您仍然可以回答这个问题,但是您可能更喜欢先阅读背景知识。 背景 人们经常说检查部分正确性是不确定的。为了便于讨论,让我们选择一种非常特殊的方式,使之以Floyd-Hoare的风格准确地表述。甲流图是带有区分的有向图的初始节点从所有的节点可达。甲程序是一个流图的节点是命令。有三种命令类型:(1)假设假设 q,(2)断言声明 q,以及(3)分配v:= e。这里q是fol(一阶逻辑)公式,e是fol项,v是变量。 我们说一个程序是部分正确时,有一种方法来注释每个节点X与前提A(X)和一个后置条件B(X) ,使得(1)的初始节点的先决条件是有效的,(2){ a(x) } x { b(x) }对所有命令x都成立,并且(3)(b(x)暗示a(y))对从x到y的所有边均有效。这里的Hoare三元组定义如下: { p } 断言 q { r }表示(p暗示(q和r))有效 { p } 假设 q { r }表示((p和q)暗示r)有效 { p } v:= e { r }表示((用e代替v的p表示r)有效 这就是为什么检查手工波浪参数这部分正确性是不可判定:当你在一些填写A(X)和部分B(X) ,你需要检查,如果一些阶逻辑公式是有效的,而且是不可判定。 在部分正确的情况下对终止进行编码的一种典型方法是添加一些特殊的断言,这些断言本质上说“自从我上次执行以来,就朝终止迈进了一步。” 必须放置这些进度断言,以使流程图上的所有无限遍历(从初始节点开始)都包含无限多个进度断言。更具体地说,假设进度断言的形式始终为assert u < v,其中u和v是正整数,在赋值u:= f之前,然后是赋值v:= …

6
标记过渡系统的实际可计算属性是什么?
我发现标记的过渡系统对于我的应用程序来说是一个很好的模型,即有一篇关于使用LTS对用例进行建模的文章。问题是,关于LTS可以轻易证明什么?我想重用现有的解决方案,看看它们是否对我的应用有用。我想知道LTS(和用例)的哪些属性可以轻松地自动证明,因此我可以决定是否存在与用例问题相对应的实用方法。

2
Monadic类的最新技术?
Monadic一阶逻辑,也称为决策问题的Monadic类,所有谓词都采用一个自变量。它被Ackermann确定,并且是NEXPTIME完整的。 但是,尽管有理论上的限制,但诸如SAT和SMT之类的问题仍可以通过快速算法来解决。 我想知道,是否有类似于SAT / SMT的研究用于单阶一阶逻辑?在这种情况下,“最先进的技术”是什么?尽管在最坏的情况下达到了理论极限,但在实践中是否存在有效的算法?

1
类型系统可防止与惰性相关的内存泄漏?
Haskell中性能问题的主要根源可能是某个程序无意间建立了一个无穷大的深度-这在评估时会导致内存泄漏和潜在的堆栈溢出。经典示例是sum = foldr (+) 0在Haskell中定义的。 是否有任何类型系统在使用惰性语言的程序中静态强制缺少此类重击? 似乎与使用类型系统扩展来证明其他静态程序属性(例如某些类型的线程安全性或内存安全性)的难度在相同的数量级上。

1
为什么在举证代码中需要举证检查器
在Necula的经典PLDI'98论文“认证编译器的设计和实现”中,高级验证程序使用: VCGen生成验证条件(安全谓词) 一阶逻辑定理证明者证明条件 LF打样检查器检查步骤(2)中的打样 我对步骤(3)感到有些困惑。为什么根本需要它?仅(1)和(2)是否足够?我们为什么不仅仅相信定理证明者生成的证明呢?

1
验证在量子采样,仿真和扩展教堂图灵(ECT)测试中的适当作用是什么?
由于未给出答案,因此已设置标志,要求将此问题转换为社区Wiki。 Aaron Sterling,Sasho Nikolov和Vor的评论已综合为以下决议,该决议已开放给社区Wiki讨论: 已解决: 关于输出数字,样本或模拟轨迹的经典算法,严格的数学逻辑要求以下四个命题全部被接受,或者都不接受: 我们可以排除多项式时间经典算法来生成随机数。 [1] “我们可以排除多项式时间经典算法对量子计算机的输出分布进行采样的唯一假设,即多项式层次结构是无限的。” [2] “我们无法以通常的方式模拟[量子力学轨迹] ……变量太多。” ψ(t)ψ(t)\psi(t) [3] 由于经典算法无法生成随机数的严格原因,排除了扩展的Church-Turing-Thesis(ECT)。 [4] 要开始讨论,这里是肯定和否定的答复,尽管每个答复都可以辩护,但故意将其夸大了。一个强烈肯定的论点可能是: 肯定的: 这四个陈述反映了一些定理,为严格起见,这些定理要求我们永远不要说生成随机数,随机样本或量子模拟的经典算法,而只说生成伪随机数和(由扩展)伪随机样本和伪量子模拟。 可以理解,所有四个陈述都是正确的。此外,为避免歧义并防止混淆,数学家应鼓励科学家和工程师在几乎所有“随机”,“样本”和“量子模拟”的用法后加上前缀“伪”。 一个强烈否定的论点可能是: 否定的: 这些陈述(及其相关联的形式定理)是引导我们进入Lakatos式的 “红灯”数学领域的路标,我们被我们热情地拥护(可能称为)伪随机性学科,伪采样和伪模拟……由于美味可恶的原因而有趣的数学实践:它们实现了数学上的效果,而形式逻辑认为这是不可能的。因此,有什么比这个结论更神奇,更有趣的:该决议的四个陈述在形式上是正确的,但实际上是错误的? 可以理解,所有四个陈述都是错误的。此外,由于在这种神奇的环境中出现了“随机性”,“采样”和“量子模拟”的大多数实际应用,在这种环境中,故意忽略了与Kolmogorov复杂性和口述评估有关的问题,因此数学家应该改变其用法。 但是,实际上,复杂性理论家应该如何表达他们与随机性,样本和模拟相关的发现……一方面是为了保持清晰度,简洁性和严谨性的合理平衡……另一方面,是为了保持与其他STEM学科的低噪声通信?后一个目标尤其重要,因为在诸如密码学,统计测试,机器学习和量子模拟等领域中,实用能力在不断提高。 阅读合理的答案(肯定的或否定的)非常有帮助(也很有趣)。 问的问题是 验证在与抽样,模拟和测试扩展的Church-Turing(ECT)论文相关的复杂度理论定义中,验证的公认角色是什么? 首选答案是对深入讨论这些问题的文章,专着或教科书的引用。 如果该文献被证明是稀疏的或不令人满意的,那么(两天后)我将把这个问题转换为社区维基,询问: 验证在与抽样,仿真和测试扩展的Church-Turing(ECT)论文相关的复杂度理论定义中,验证的合理和适当角色是什么? 背景 提出该问题的动机是基于最近的主题“反驳Church-Turing论文意味着什么?” ,特别是Gil Kalai和Timothy Chow给出的(出色的恕我直言)答案 在提出的问题中,“适当和/或公认的复杂性理论定义”一词应解释为限制Alice提出如下不合理的主张: 爱丽丝: 这是我的(单光子)线性光学网络计算出的真实随机二进制数字的实验样本。鲍勃: 这是我用经典图灵机计算出的伪随机数的模拟样本。爱丽丝: 对不起,鲍勃...您的样本在算法上是可压缩的,而我的则不是。因此,我的实验数据表明ECT是错误的!” 在没有将验证与抽样相关联的情况下,爱丽丝的推理是无可挑剔的。换句话说,复杂性理论家是否应将ECT视为……几十年前已被正式证明? 从实践的角度来看,与各种状态空间上的量子轨迹采样相关的模拟方法已在许多科学和工程学科中得到广泛使用。这就是为什么对科学和工程学中验证的核心作用(与可复制性密不可分的)采样的复杂性理论定义非常欢迎实践的科学家和工程师……尤其是在这些定义伴随着描述定理的计算复杂性的定理的情况下经过验证的抽样。 附加编辑: 由于日内瓦大学和id Quantique公司之间的合作,在现实中完成此练习是完全可行的。 以下是1024个随机位,这些位已通过id Quantique认证为算法上不可压缩: 0110001000010111111100010111001000101110110001001100000010010110 …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.