高完整性系统(4)Formal Logic (形式逻辑和 Alloy 简介)

news2024/11/12 10:48:32

文章目录

  • Story so far
  • 形式逻辑
    • 命题 proposition
    • 谓词 predicate
    • 连接词
    • Variables
    • Set 集合
      • Set operation 集合操作
      • Set Relationship 集合关系
      • Alloy Set alloy 的集合表示
      • Quantification 量词
      • Relations 关系
        • 案例
        • Binary Relations 二元关系图
        • Functions 函数
          • Total v.s. Partial Function
        • Relation Operation 关系操作
          • add
          • update
          • restriction
          • relation joins
          • function call 函数调用

Story so far

在这里插入图片描述

在软件工程生命周期的 Design 阶段,使用一种形式化规范的方法,通过逻辑推理来检查系统的设计是否满足需求,并确保这些需求得到保证。他们提到了一个基于模型的规范风格,称之为形式化规范。这种规范使用逻辑来书写系统的需求和设计,并使用逻辑推理来检查系统设计是否满足这些需求。演讲者提到,为了简化逻辑推理的过程,他们将使用一个外部工具来完成这个任务。

在这里插入图片描述

为了更好地理解形式化规范的概念,讲者介绍了一种简单而强大的逻辑——一阶集合论 / 谓词逻辑,并解释了如何使用这种逻辑来写下规范,并通过逻辑推理来验证规范是否满足要求。他还提到,为了实现这些规范,将使用一种名为Alloy的工具,它可以帮助我们理解规范的含义,并验证规范中的某些属性是否成立。

形式逻辑

我们要讨论的是一些相对简单的概念,但我们会尽可能地精确,包括命题集合、谓词和关系。我们还会谈到我们对这些概念的理解或见解。在介绍这些普通概念(如集合和关系等)的同时,我还会试图给你们展示这些概念在Alloy中的应用。我将努力保持一致性,用蓝色字体表示Alloy理解的内容及其符号。

命题 proposition

首先,什么是命题呢?命题在逻辑中是最基础的东西。逻辑主要讨论的是事物的真假。所以,命题就是你能在逻辑中写下的最基本的陈述,它是真的,还是假的。例如,"现在正在下雨"就是一个命题。这是一个可能为真也可能为假的陈述。这个命题显然是相对于现在的时间和我们所在的地点的。我想我们都同意,除非我们进入大楼后天气发生了巨变,否则现在这里应该没有下雨。所以,这个命题现在是假的。
在这里插入图片描述

  • 那么在 alloy 中,我们就用 Raining 来表示这个 命题
  • 这个词在Alloy中有一个特殊的名称,它被称为 Atom。在后续的内容中,我们将了解如何定义这些原子。但现在,你可以将 raining 这个词视为一个原子命题,它要么是真,要么是假。

谓词 predicate

  • 但是,我们可能想要更具体一些。我们可能想要说出它在哪里下雨。这就是一个命题:在Parkville正在下雨。在Alloy中,我们可能会写成 Raining[Parkville]。在Alloy中,当你用参数调用一个函数或谓词时,几乎总是要用方括号
    在这里插入图片描述

  • 所以在第二个例子的 raining 中,不是一个单一的事物,它既可以为真也可以为假。我们可以将它视为一个函数,它接受一个参数(在这个例子中,是一个地点Parkville)并根据在Parkville是否下雨来返回真或假。

  • 现在,这个函数本身有一个特殊的名称,它被称为谓词。所以,谓词基本上就是接受一个参数的命题,然后返回真或假。或者,一个谓词可能接受多个参数,然后根据命题的类型返回真或假。

在这里插入图片描述

连接词

  • 当然,我们可能想要写下更复杂的命题,例如连接其他命题的命题,或者复合语句(compound proposition)。例如:“在Parkville正在下雨,而在Sydney却没有下雨”。为了做到这一点,我们需要一些方法来组合我们的命题,以构建更大的命题。
    在这里插入图片描述

  • 所以,我们有所谓的逻辑连词,用于将命题连接在一起,形成更大的命题。

    • 我们可以将两个命题连接在一起,表示它们都必须为真,这就是逻辑与(and)。
    • 我们也可以将两个命题连接在一起,表示其中一个必须为真,这就是逻辑或(or)。
    • 我们还可以表示一个命题必须为假,这就是非(not)或否定。
    • 我们可以表示,如果一个命题为真,那么另一个命题也必须为真,这就是蕴含(implies)或逻辑蕴含。
    • 我们还可以表示两个命题必须同时为真,这就是当且仅当(iff),也就是它们必须具有相同的值。或者等价地,我们可以说它们必须互相蕴含。
  • 在Alloy中,我们写下这些内容时,我们将使用左边这一列的符号,如 and、or、not、implies、iff等。

有了这些工具,我们当然可以构建更大的命题,例如:在Parkville正在下雨,而在Sydney没有下雨。或者我们可以写下像 raining[Parkville] implies not raining[Sydney] 这样的语句。那么,这意味着什么呢?

对,如果在Parkville下雨,那就意味着在Sydney没有下雨。这就是你应该如何理解蕴含的含义。

到目前为止,我们讨论的都非常简单,只是一些非常基础的逻辑语句,比如在Parkville下雨或者下雨。

Variables

当然,在你的系统规范或对你的系统及其期望特性的逻辑描述中,你在写下这些内容时,你需要能够引用系统状态的不同部分。对此,我们有变量。我们在编程语言中有变量,所以在逻辑中有变量不应该让人感到惊讶。

在这里插入图片描述

例如,我们可能有一个描述系统中平均速度的变量,我们可能想要说它大于10。这是我们可能想要写下的非常简单的命题。你可以看到,这不仅引用了一个变量,而且还引用了一个常数,即数字10, 显然,这是一个 relation,即 > 关系。 > 就是一个关系,你给它两个数,它会告诉你第一个数是否比第二个数大。你给它两个数,它会返回真或假,取决于第一个数是否比第二个数大。这预示了我稍后会告诉你的一件事,即关系就是谓词。但是,我们稍后再回到这个问题。

在这里插入图片描述

所以,我们可以说诸如 averageVelocity > 10 and currentVelocity = 11 之类的事情。

现在,当我们在我们的形式化规范中使用变量时,我们所做的是描述我们希望我们的系统如何行为,或者我们希望我们的系统具有哪些特性,而这些变量将被用来引用状态的不同部分。 但这是在我们的逻辑模型中的状态,而不一定是我们用逻辑描述的系统或程序的实际状态。

在这里插入图片描述

例如,averageVelocity 可能不会在真实系统中存在,比如如果这是在模拟一辆车的电子自动刹车系统,那么在那个电子控制单元中可能没有一个叫做 averageVelocity 的变量。相反,averageVelocity 可能只存在于我们的规范中,可能是指最近的n个速度变量值的总和除以n。所以,重点是,我们可以在我们的模型或规范中有一些在真实系统中不存在的东西,但是仍然允许我们谈论我们希望真实系统具有的真实系统的特性。

Set 集合

在这里插入图片描述

Alloy中的一个重要概念是集合。事实上,在Alloy中,所有的东西都是集合,所有的东西都是关系,而这两者实际上是一样的。 所以,集合将是非常重要的。集合就是一组事物的集合,我们可以用大括号将元素围起来,或者我们可以用所谓的集合推导式来描述一个集合,比如 “所有偶数x的集合”。这就是一些基础的逻辑概念和Alloy的概念。

Alloy 提供了一些特殊的集合供我们讨论:

  • 全集(universal set,Alloy 中表示为 univ
  • 空集(empty set,Alloy 中表示为 none

Set operation 集合操作

当然,我们可以开始讨论集合运算,如 A 集合和 B 集合中的所有元素(Alloy 中用 + 表示),或者既在 A 集合又在 B 集合中的所有元素。我们还可以讨论在 B 集合中但不在 A 集合中的所有元素。如果你曾经接触过集合论,你应该会知道这三个操作就是标准的 并集、交集和差集。Alloy 是以方便键盘输入为目标设计的符号系统,因此并集 +、交集 & 和差集 - 的表示方法都是键盘友好的。在传统的数学符号系统中,这些操作通常分别表示为 ∪, ∩, \。这个方便的设计在你实际写 Alloy 的时候会很有帮助。

在这里插入图片描述

Set Relationship 集合关系

在这里插入图片描述

Alloy Set alloy 的集合表示

在这里插入图片描述

  • x in AB in A 其实没有本质的区别,因为在 alloy 中所有的东西都是集合,其实 x in A 不过是 {x} in A 即,只包含一个元素的集合 {x} 属于集合 A
  • 3 其实就表示 {3},即使是一个元素,在 alloy 中也代表一个集合
  • #A 在 alloy 中是获取集合元素个数的操作

Quantification 量词

这部分将讨论逻辑定量词,并将其与集合、谓词和关系相联系。
首先,让我们从逻辑定量词说起。例如,我们可以说 “P 对所有的 x 都成立”,或者我们可以说 “不存在一个 x 使得 P 不成立”,或者 “不存在一个 x,使得 P 的否定为真”。在逻辑和 Alloy 中,我们可以这样表示 “非存在某个 x 使得非 P(X)”
在这里插入图片描述

同样的原理也适用于存在量词
在这里插入图片描述

在这里插入图片描述

Alloy 为了方便使用,有时会提供一些额外的量词,你可以根据我们已经看到的内容来定义它们。例如,你可能想说 存在某个 X 使得 P(X) 成立,但你可能想明确表达的是,这对于 X 的某一个值是真的,Alloy 为此提供了一个特别的量词 one。或者你可能想说 P 对于最多一个 X 的值成立,Alloy 为此提供了一个 lone 量词。**记住这个量词的方法是,它表示 P 对于 X 的值小于或等于一个成立,即 “less than or equal to one”,**即 “l one”。当然,你也可以表示没有任何 X 的值使得 P 成立,即 “none x | P[x]”。

Relations 关系

在这里插入图片描述

我曾经说过我们将学习 集合、谓词和关系,并暗示所有这些事物实际上都是一样的。Relation 本质上就是 谓词,你给它们一些参数(通常是一或两个),它们根据这个关系是否成立返回真或假。比如我们之前看到的 > 关系,如果我们将它视为一个接受两个参数(比如6和5)的函数,那么 “大于” 会返回真,因为6大于5。但如果我们给它的参数是2和3,它会返回假,因为2不大于3。

我们将 Relation 视为返回真或假的谓词。一个 relation 的元(arity)就是它需要的参数数量。我们看到的如 “大于” 这样的**关系是二元关系,因为它需要两个参数。**但你也可以有一元关系,只需要一个参数就可以返回真或假,或者你可以有接受多个参数的关系,然后返回真或假。

谓词和关系通常被用来定义集合。例如,集合 { x ∈ Z | x > 0 } 是所有正整数的集合。这个集合的定义包含一个谓词 “x > 0”,这个谓词描述了集合中元素的性质。只有那些满足这个谓词的元素才会被包含在集合中。

然而,Alloy并不直接支持这种方式定义集合。Alloy是基于关系的模型,因此在Alloy中,我们构建 relation 是基于元组:

在这里插入图片描述

  • 在这个例子中,Sum 表示的是一个三元的关系,每一个三元关系中,都包含三个变量 x,y,z,这个 Sum relation 当然也是一个集合。
  • 简化来说,relation 就是 tuple 的集合

案例

在这里插入图片描述

  • 在这个例子中,我们首先定义了一个 relation Factor,也就是说对于 Factor 中的每个项,都是一个包含 (x,y,z) 的元组,其中 x = y * z
  • 接下来我们的任务是定义一个 predicate,当我们把 (x,y,z) 放到这个 predicate 中的时候,如果是 prime,那么就会返回 true
  • 由于我们已经得到了关系 Factor,而 prime 的定义是: 一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数。
  • 在这个例子中,我们首先针对一组 (x, y, z) 因为 x = y * z 所以这时候 yz 的值就变成了是否让 x 成为 prime 的关键。因此我们将这个 isPrime 的谓词逻辑定义为:all y, z | (x,y,z) in Factor implies y=1 or z=1 或者也可以写成 all y, z | Factor(x,y,z) implies y=1 or z=1
    在这里插入图片描述
  • 从本质上来看 relation, predicates 以及 sets 都是一样的

Binary Relations 二元关系图

在这里插入图片描述

  • 图中表示了 < 这种relation,这是一种二元关系,在二元关系中,我们定义一个 domain 一个 range,即 定义域值域,例如:从 3 指向 4 的箭头 3 -> 4 表示了在这个关系中 3 < 4

在这里插入图片描述

  • 在数学中,我们通常会用形式化的方法来表示两个 set 之间的 relation
  • 例如,我们现在有一个 setusername,其中包含了 username_1, .... username_n,还有一个 password 集合,其中包含 pass_1,....,pass_m, 那么如果我们有一个数据库 LDAP,代表 username -> password 的关系,那么我们可以表示 LDAPDBLDAPDB 一定是 usernamepassword 笛卡尔积组成的集合的一个子集,即 LDAPDB ⊂ \subset username × password
    在这里插入图片描述

Functions 函数

  • 如果每个 username 只对应一个 password, 那么这种关系可以看做函数 function
    在这里插入图片描述
Total v.s. Partial Function

在这里插入图片描述

  • partial function 就是给定一个 username,未必会对应一个 password
  • total function 则是一一对应的关系

Relation Operation 关系操作

在这里插入图片描述

add
  • 当我们已经拥有一组关系 relation: A -> B ,那么我们可以通过 + 这个操作符来扩展这个 relation,如图所示,我们在 relation 中增加了一个新的关系 (u4->p2)
    在这里插入图片描述
update

在这里插入图片描述
在这里插入图片描述

restriction

在这里插入图片描述

  • 符号 <: 表示,只关心当前 relation 中的 u1 和 u2,其他的不管,有点类似于 filter 操作
  • 这个符号不仅可以用于 domain,还可以用于 range
    在这里插入图片描述
  • 这样的写法表示,我们只关心 {p1, p3} ,而不关心 password 中包含的其他内容
relation joins
  • A.B 代表 join 操作
    在这里插入图片描述
  • 拿第一个 A 中的 (0,1) 举例子,它的最后一个位置的 1 与 B 中的 (1,1,1) 的第一个位置的 1 相同,因此他们可以 joinjoin 之后的结果表现为 A.B=(0,1,1) 因为他们共同的 1 被合并了,同样的,后面以此类推
  • A.B 还可以表示为 B[A]:
    在这里插入图片描述
function call 函数调用

在这里插入图片描述
我们已经知道了几点知识:

  • 函数 f 是一组关系,包含了 (a1, b1), … (a_i, b_i) 的总共 i 个元组,由于 f 构建的是 A->B 的映射关系,因此我们可以写成 A->B
  • join 操作可以表示为 A.B 等价于 B[A]

那么针对上述的知识,如果我们调用函数 f 并将 a_i 作为参数传入,会得到什么结果呢?

  • 首先 a_i 相当于 {a_i},所以 f[a_i] = {a_i}.f 也就是集合 {a_i} 与整个关系 fjoin 操作
  • 那么结果显而易见就是 (a_i) 只能匹配到 (a_i, b_i) 并进行联合,而共同的 a_i 被消掉了,因此最终的结果是 b_i 也可以认为是 {b_i}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/611191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IO模型、select、poll、epoll

阻塞IO模型 阻塞IO是最通用的IO类型&#xff0c;使用这种模型进行数据接收的时候&#xff0c;在数据没有到之前程序会一直等待。例如&#xff0c;对于函数recvfrom(),内核会一直阻塞该请求直到有数据到来才返回。 非阻塞IO模型 当把套接字设置成非阻塞的IO,则对每次请求&…

Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)

目录 引出:bug::bug::bug:Tomcat开发的bug汇总项目启动就报错1.WebServlet()路径配置的问题2.由于之前的错误&#xff0c;Context[/day01]启动失败【困扰】3.启动过滤器异常---init方法 JSP使用相关报错1.后端传给jsp的数据&#xff0c;前端jsp不显示2.jsp的包没有导&#xff0…

6 vue

前端开发 1.前端开发 前端工程师“Front-End-Developer”源自于美国。大约从2005年开始正式的前端工程师角色被行业所认可&#xff0c;到了2010年&#xff0c;互联网开始全面进入移动时代&#xff0c;前端开发的工作越来越重要。 最初所有的开发工作都是由后端工程师完成的&…

‘jupyter‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

目录 0.问题背景环境介绍 1.解决步骤 2.测试步骤 0.问题背景环境介绍 1&#xff09;环境&#xff1a;windows64 2&#xff09;问题背景&#xff1a;在搭建jupyter notebook的过程中&#xff0c;想用windows的任务管理器启动jupyter notebook或者使用【jupyter notebook --…

降低成本,快速搭建企业帮助文档的方法盘点

企业帮助文档是企业为了解决客户疑问和提高客户满意度而制作的一种文档&#xff0c;通常包括产品的使用指南、故障排除、常见问题解答等内容。一个好的帮助文档可以帮助企业降低客服成本、提高客户满意度&#xff0c;进而提高产品销量和企业品牌形象。但是&#xff0c;有些企业…

基于html+css的图展示108

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

MFC(十二)多个对话框

我们来制定多个对话框&#xff0c;每个对话框都有不同的功能&#xff0c;单击下一步&#xff0c;即可跳转到下一个对话框 1.新建一个启动按钮 2.在资源视图&#xff0c;Dialog里面&#xff0c;右键-->添加资源---->dialog>选择IDD PROPPAGE_SMALL新建 属性页&#…

「移动机器人行业应用分析」锂电行业

锂电池作为目前一种比较成熟和先进的电池&#xff0c;因其质量轻&#xff0c;储电量大等特点&#xff0c;受到了人们的广泛应用。中国作为全球最大的锂电生产和消费国&#xff0c;也是全球最大的电动汽车市场&#xff0c;随着“碳中和”这一目标的提出&#xff0c;锂离子电池技…

陶瓷板检测系统在工业质检领域的前景

陶瓷是一种重要的工业材料&#xff0c;广泛应用于建筑、电子、航空航天、医疗等领域。在生产过程中&#xff0c;陶瓷制品需要经过多道工序&#xff0c;其中检测环节是非常重要的一环。传统的陶瓷板检测方式主要依赖人工目视检测&#xff0c;效率低下且容易出错。随着人工智能技…

5年Java经验字节社招:15天3次面试,成功拿下Offer

背景经历 当时我工作近5年&#xff0c;明显感觉到了瓶颈期。具体来说&#xff0c;感觉自己用过很多框架、做过一些技术设计、也有过一些产出&#xff0c;但是从技术深度上感觉不足&#xff0c;到后期时做事也没有明显挑战&#xff0c;完全适应了公司节奏&#xff0c;说句不好听…

企业做直播如何选择好的直播平台?需要考虑哪些方面?

企业做直播如何选择好的直播平台&#xff1f;需要考虑哪些方面&#xff1f;我将从功能需求、可靠性与稳定性、用户体验、技术能与售后服务能力等方面进行综合考虑&#xff0c;帮助您做出明智的决策&#xff0c;或是说提供选型方面的参考。 企业在选择一家直播平台时应考虑以下因…

Vue.js 中的过滤器是什么?如何使用过滤器?

Vue.js 中的过滤器是什么&#xff1f;如何使用过滤器&#xff1f; 在 Vue.js 中&#xff0c;过滤器是一种以函数为基础的可重用代码片段&#xff0c;用于对数据进行格式化和处理。通过使用过滤器&#xff0c;我们可以在模板中对数据进行简单的转换&#xff0c;以便更好地呈现给…

chatgpt赋能python:Python在主函数中调用函数:提高代码可读性和降低重复性工作

Python在主函数中调用函数&#xff1a;提高代码可读性和降低重复性工作 在Python编程中&#xff0c;我们常常需要将代码分解成多个函数来实现各种功能。而主函数则是整个程序的执行入口。调用函数可以降低代码的复杂度和耦合性&#xff0c;并且使得代码更容易维护和重用。 基…

开源赋能 普惠未来|元遨/CARSMOS诚邀您参与2023开放原子全球开源峰会

元遨/CARSMOS定位于面向全球国际合作的平等自治的智能驾驶开源社区&#xff0c;秉持“走出去&#xff0c;引进来”的双向开放策略&#xff0c;通过互联网技术和开源社区模式相结合&#xff0c;建立和发展开源智能驾驶的科研、教育、产业化起步平台&#xff0c;包括开源软件、开…

centos7下svnserve方式部署subversion/SVN服务端(实操)

一般来说&#xff0c;subversion服务器可以用两种方式架设&#xff1a; 一种是基于svnserve&#xff0c;svnserve作为服务端&#xff1b; 一种是基于Apache&#xff0c;用apache作为服务端。 这里采用第一种方式部署。 执行如下命令&#xff0c;安装SVN。 yum install sub…

各跨境电商平台测评自养号环境方案

在电商领域&#xff0c;很多卖家和工作室总是在寻找可以提高销售量、提升产品评级的方法。有了我们这套独特的测评系统&#xff0c;这一切都可以变得简单许多。可以让你轻松地创建和管理大量高质量的账户&#xff0c;自主掌控真实买家的浏览、购买、下单、评价等行为&#xff0…

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

本文同步更新于鼠鼠之家SpringBoot——原理&#xff08;自动配置_案例(自定义阿里云文件上starter)&#xff09; - 鼠鼠之家~我要怎么水够标题长度 starter定义 starter就是springboot中的起步依赖&#xff0c;虽然springboot已经提供了很多的起步依赖&#xff0c;但是在实际…

Yolov5s算法从训练到部署

文章目录 PyTorch GPU环境搭建查看显卡CUDA版本Anaconda安装PyTorch环境安装PyCharm中验证 训练算法模型克隆Yolov5代码工程制作数据集划分训练集、验证集修改工程相关文件配置预训练权重文件配置数据文件配置模型文件配置 超参数配置 测试训练出来的算法模型 量化转换算法模型…

云南LED、LCD显示屏系统建设,户外、室内广告大屏建设方案

LED大屏幕显示系统是LED高清晰数字显示技术、显示单元无缝拼接技术、多屏图像处理技术、信号切换技术、网络技术等科技手段的应用综合为一体&#xff0c;形成一个拥有高亮度、高清晰度、技术先进、功能强大、使用方便的大屏幕投影显示系统。通过大屏幕显示系统&#xff0c;可以…

SpringBoot1-案例以及快速启动

1.概述 简化Spring应用的初始搭建以及开发过程 原生开发SpringMVC程序过程 创建一个Maven工程&#xff0c;在pom打入坐标&#xff1b;配置类ServletConfig&#xff0c;初始化Spring容器和SpringMVC容器&#xff1b;创建配置类SpringConfig和SpringMVC配置类&#xff1b;至少要有…