Alloy Tutorial(1)Alloy 基本使用

news2024/11/17 23:54:28

文章目录

  • 构造一个 graph
  • 谓词
  • undirected 无向图
  • undirected2 无向图的第二种写法
  • assert
  • Fact
  • 扩展

构造一个 graph

In this workshop we are going to use Alloy to model graphs. Mathematically, recall that a graph is just a pair ⟨V, E⟩ where V is a set of vertices (aka nodes) and E is a set of edges. Each member of E is a pair (v, u) 1 where each of v and u are vertices from V . (v, u) is in E if and only if the graph has an edge from vertex v to vertex u.
We will model this in Alloy using the following signature declaration.
在这里插入图片描述

The first part declares a set Node which will be the set of possible nodes in the graph. The second part
declares a binary relation edges on Nodes. Technically it declares a set Graph of graphs that has only
“one” element (i.e. our model is talking about just a single graph). For any graph g, g.edges is then the
edge relation for that graph. Since the set Graph has only one element in it, to refer to the set of edges in
the graph in our model we can just write Graph.edges.

谓词

Enter the following predicate definition, which specifies when a graph g has exactly two edges.
在这里插入图片描述

  • 谓词的作用简单:给定一个 graph 实例,当这个 graph 满足谓词的定义的时候,谓词就 hold 了,或者说 pred 结果就为 true

    We can use the run command to view satisfying instances of this predicate, i.e. to get Alloy to show us
    graphs that have exactly two edges. Add the following run command and then choose Execute → Run
    has two edges from the menu.

undirected 无向图

Write a predicate is undirected that holds for a graph g when that graph is undirected. Recall an
undirected graph is one such that whenever it contains an edge (v, u) it also contains the symmetric edge (u, v).
Use the run command to view instances of your predicate.

sig Node{}

one sig Graph{
	edges: Node -> Node
}

//
//pred hasTwoEdges{
//	all g: Graph | #g.edges = 2
//}

pred hasTwoEdges[g: Graph]{
	#g.edges = 2
}

pred is_undirected[g: Graph]{
// 错误写法:
// all u, v : Node | (g.edges[u] <=> g.edges[v])
// 因为 g.edges[u] 返回的不是布尔类型
//	all u, v : Node | (v in g.edges[u] <=> u in g.edges[v])
	all u, v : Node | (v in g.edges[u] => u in g.edges[v] and u in g.edges[v] =>v in g.edges[u] )
}
  • 一定注意的是错误的写法:

    pred is_undirected[g: Graph]{
    // 错误写法:
    // all u, v : Node | (g.edges[u] <=> g.edges[v])
    // 因为 g.edges[u] 返回的不是布尔类型
    }
    
  • g.edges[u] 返回的根本就不是 bool 类型,因此与 <=> 这种逻辑符号进行连接是肯定不对的

undirected2 无向图的第二种写法

The following two functions are shorthand respectively that given a graph g and node v, return the set of nodes with edges to v, and those with edges from v respectively.
在这里插入图片描述
Using these functions, write a predicate is undirected2 that holds for a graph g precisely when g is
undirected.


fun edges_to[g: Graph, v: Node]: set Node {
	//given a graph g and node v, return the set of nodes with edges to v,
	g.edges.v
}

fun edges_from[g: Graph, v: Node]: set Node {
	//given a graph g and node v, return the set of nodes with edges from v,
	g.edges[v]
}

pred is_undirected2[g:Graph]{
	all u: Node | edges_to[g, u] = edges_from[g, u]
}

run is_undirected2 for 3 but 5 Node

assert

The following assertion asserts that the two definitions is undirected and is undirected2 are logically equivalent.
在这里插入图片描述
在这里插入图片描述

Here we are instructing Alloy to check it for modes of size up to 20 members of each signature, i.e. graphs that have at most 20 nodes. Enter this command and then execute the check by choosing Execute → Check is undirected equiv for 20 from the menu. Alloy should not find any counter-example (i.e. any model in which this assertion is false), and should produce output like the following:
在这里插入图片描述

Fact

Alloy fact declarations declare axioms, i.e. assumptions that Alloy will assume are always true. When generating instances of a model or searching for counter-examples to an assertion, Alloy will only consider ones that satisfy the assumptions stated in fact declarations.

在这里插入图片描述

What does this fact say? Modify this fact to instead say that every graph has exactly three (3) edges. Then re-run the has two edges predicate. What happens? Why?

  • fact 的意思就是,强制只考虑符合 fact 定义的情况,其他不符合的自动被过滤了
fact at_least_one_edge{
	all g:Graph | #g.edges=3
}

pred hasTwoEdges[g: Graph]{
	#g.edges = 2
}
run hasTwoEdges
  • 这里的 run 一定找不到任何符合要求的 instance
  • 因为在 run 的时候假定所有的 instance 都有 3 个 edge,但是 hasTwoEdge 只要刚好有 2 条 edge 的实例,所以没有任何符合条件的实例

扩展

If you have time: What do the following predicates mean? Enter each and use Alloy’s run command to help work out what they are saying logically. Write down your answer as comments in your Alloy file.
在这里插入图片描述

这两个pred定义都试图描述图中的某种关系,但它们的含义是不同的:

  • what_does_this_mean1[g: Graph]: 这个谓词表示在图 g 中,对于所有的节点 u 和 v,都存在从u到v的边,并且从v到u的边。这个谓词实际上在描述一个无向图,因为无向图的特性就是如果存在一个从u到v的边,那么必须存在一个从v到u的边。

  • what_does_this_mean2[g: Graph]: 这个谓词表示在图g中,对于所有的节点u和v,要么存在从u到v的边,要么存在从v到u的边,或者两者都存在。 这个谓词的含义更为广泛,它实际上描述的是一个连通图,连通图的特性就是对于所有的节点对,至少存在一条边使得这两个节点是连通的。注意,这并不意味着图是无向的,因为它并未要求如果存在从u到v的边,那么必须存在从v到u的边。

  • 但当我认为 what_does_this_mean1[g: Graph]is_undirected 以及 is_undirected2 是等价的时候,我发现其实并不是:


pred what_does_this_mean1[g: Graph] {
all u, v: Node | (u -> v) in g.edges and (v -> u) in g.edges
}
pred what_does_this_mean2[g: Graph] {
all u, v: Node | (u -> v) in g.edges or (v -> u) in g.edges
}

assert isEqual{
	all g:Graph | what_does_this_mean1[g] <=> is_undirected2[g]
}

//run hasTwoEdges
//check is_undirected_equiv for 20

check isEqual 
  • 在上述的代码中我找到了 counter example,情景是:

Node1 -> Node1
在这里插入图片描述

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

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

相关文章

参数估计和假设检验的区别与联系

1.参数估计和假设检验的区别与联系 笔记来源&#xff1a; 参数估计与假设检验 参数估计和假设检验有什么区别&#xff1f; 1.1 联系 参数估计和假设检验是推断统计的两个组成部分&#xff0c;它们都是根据样本信息对总体的数量特征进行推断 下图来自《统计学图鉴》 参数估计…

详解WEB集群服务(LNMP+Nginx+Tomcat+Rewrite重写+七层反向代理+SNAT|DNAT策略)

实战项目演练 1.问题描述2.实验操作步骤2.1 CentOS 7-1客户端配置2.2 CentOS 7-2网关服务器配置2.3 CentOS 7-8 (Web1:Tomcat服务器)2.3.1 安装Tomcat服务器2.3.2 提供四层反向代理的动态页面 2.4 CentOS 7-9 (Nginx服务器)2.4.1 安装Nginx服务2.4.2 安装MySQL服务2.4.3 安装配…

基于Python的接口自动化-读写配置文件

目录 引言 configparser模块功能介绍 引言 在编写接口自动化测试脚本时&#xff0c;有时我们需要在代码中定义变量并给变量固定的赋值。为了统一管理和操作这些固定的变量&#xff0c;咱们一般会将这些固定的变量以一定规则配置到指定的配置文件中&#xff0c;后续需要用到这…

如何在电脑上使用wink一键高清短视频

如何在电脑上使用wink一键高清优化短视频画质 文章目录 如何在电脑上使用wink一键高清优化短视频画质1.软件简介1.1痛点1.2解决方案 2.实际操作2.1准备工作2.1.1下载雷电模拟器2.1.2下载wink 2.2.安装软件2.2.1安装雷电模拟器2.2.2安装wink2.2.2.1在雷电模拟器中安装wink2.2.2.…

LeetCode 双周赛 106(2023/06/10)两道思维题

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 加入知识星球提问。 往期回顾&#xff1a;LeetCode 单周赛第 348 场 数位 DP 模版学会了吗&#xff1f; 双周赛 106 概览 T1. 判断一个数是否迷人&#xff08;Easy&#xff09; 标…

如何做企业发布会直播/企业发布会直播流程

1 .企业发布会直播流程图 2 .发布会解决方案 A .发布会直播前 B .发布会直播中 C .发布会直播后 如何做一场企业新品、产品发布会直播&#xff1f;流程图&#xff1a; 01 发布会直播前 专业全案策划 全面深入挖掘客户直播需求&#xff0c;拆解需求&#xff0c;制定全流程落地方…

Selenium 必了解—如何测试REST API

目录 前言&#xff1a; Web UI测试存在的问题&#xff1a; REST API测试&#xff1a; 依赖包 程序示例&#xff1a; 1-获取联系人 2-GET Request&#xff1a; 3-POST Request: 4- 编辑请求 5- 删除请求 前言&#xff1a; Selenium WebDriver 可以用于测试 Web 应用的…

深度学习框架(Pytorch)学习第1步:包管理系统Anaconda的安装

PyTorch是一种开源的深度学习框架&#xff0c;以出色的灵活性和易用性著称。 并且与机器学习开发者和数据科学家喜欢的Python高级编程语言兼容。 什么是PyTorch PyTorch是一种构建深度模型功能完备的框架。通常用于图像识别和语言处理等。 使用Python编写&#xff0c;学习和…

UI自动化测试之Airtest让你的测试工作如虎添翼!

本文我们讲解下Airtest的使用&#xff0c;主要学习目标有以下几点&#xff1a; &#xff08;1&#xff09;认识Airtest &#xff08;2&#xff09;了解Airtest能做什么 &#xff08;3&#xff09;Airtest安装及环境搭建 &#xff08;4&#xff09;掌握Airtest图形化api使用 &am…

【MySQL】记录的基本操作

文章目录 插入数据为表中所有字段插入数据为表中指定字段插入数据同时插入多条数据 更新数据删除数据TRUNCATE和DETELE的区别 查询数据 插入数据 为表中所有字段插入数据 基本语法 INSERT INTO 表名&#xff08;字段名1,字段名2,…) VALUES (值 1,值 2,…); 示例 # 准备一张表…

算法模板(4):动态规划(4) 做题积累(2)

动态规划 9. 单调队列优化DP 1. 1088. 旅行问题 John 打算驾驶一辆汽车周游一个环形公路。 公路上总共有 n 个车站&#xff0c;每站都有若干升汽油&#xff08;有的站可能油量为零&#xff09;&#xff0c;每升油可以让汽车行驶一千米。 John 必须从某个车站出发&#xff…

接口自动化-让你了解数据库相关知识

目录 python接口自动化实战 数据库 写一个对数据库操作的类 python接口自动化实战 目标 学习数据库相关&#xff0c;用例增加对数据库校验 利用数据库完成对数据查询 如何校验数据库数据&#xff0c;怎样添加校验让程序自己校验&#xff08;充值、提现、投资接口对金额的…

VMware ESXi 7.0 Update 3m - 领先的裸机 Hypervisor (All OEM Customized Installer CDs)

VMware ESXi 7.0 Update 3m - 领先的裸机 Hypervisor (All OEM Customized Installer CDs) ESXi 7.0 U3m Standard (标准版) ESXi 7.0 U3m Dell (戴尔) 定制版 OEM Custom Installer CD ESXi 7.0 U3m HPE (慧与) 定制版 OEM Custom Installer CD ESXi 7.0 U3m Lenovo (联想) 定…

分布式项目17 订单order,用dubbo来实现

说明&#xff1a;只要当一个订单生成时&#xff0c;处理订单的信息之外&#xff0c;还有订单中包含的订单商品数据以及订单物流信息&#xff0c;而订单的信息封装在“tb_order”表中&#xff0c;关于tb_order表结构如下图所示&#xff1a; 订单商品数据封装在“tb_order_item”…

STM32使用PWM实现led亮度变化

原理及代码讲解 1.序言2.频率3.占空比4.控制led亮度变化原理5.代码实例5.1 初始化引脚5.2 配置定时器15.3配置输出PWM 6.结语 1.序言 这里我以stm32F103c8te为例&#xff0c;讲解一下pwm如何输出&#xff0c; pwm又是如何控制led灯的亮度变化&#xff0c;以及具体代码又是 如何…

53、基于51单片机蓄电池充电器过充过放保护LCD液晶屏显示系统设计(程序+原理图+PCB源文件+参考论文+参考PPT+元器件清单等)

方案选择 单片机的选择 方案一&#xff1a;AT89C52是美国ATMEL公司生产的低电压&#xff0c;高性能CMOS型8位单片机&#xff0c;器件采用ATMEL公司的高密度、非易失性存储技术生产&#xff0c;兼容标准MCS-51指令系统&#xff0c;片内置通用8位中央处理器(CPU)和Flash存储单元&…

STL之Stack与queue的模拟实现与duque的底层结构(3千字长文详解)

STL之Stack与queue的模拟实现与duque的底层结构 文章目录 STL之Stack与queue的模拟实现与duque的底层结构设计模式的概念适配器模式 stack的实现queue的实现双端队列——dequedeque的底层结构 设计模式的概念 设计模式像是古代的兵法&#xff0c;是以前的人总结出来的一些在特定…

TClientDataSet 模拟 EXCEL表

日常处理数据时&#xff0c;经常需要&#xff0c;从EXCEL表格中&#xff0c;批量导入数据&#xff0c;通过 XLSReadWriteII编程&#xff0c;会很快导入。 但是&#xff0c;客户提供的EXCEL表的字段&#xff0c;数据格式&#xff0c;字段的排序&#xff0c;有很大的区别。因此&a…

PostmanScript脚本功能使用详解!

目录 前言&#xff1a; 一、Pre-requestScript 二、TestScript 三、随机参数&#xff1a; 前言&#xff1a; Postman 是一个强大的 API 工具&#xff0c;可以用于构建、测试和文档化 Web API。Postman 还提供了一个名为 PostmanScript 的功能&#xff0c;它可以用于自动化…

【5】Midjourney Prompt

Prompt 是Midjourney Bot解释以生成图像的简短文本短语。 Midjourney Bot将Prompt 中的单词和短语分解成为Token的较小部分&#xff0c;可以将其与训练数据进行比较&#xff0c;然后用于生成图像。 精心制作的 Prompt可以帮助生成独特且令人兴奋的图像。 Structure 结构 基本…