Math AMN与数学逻辑符号
我不确定这是否适合stackoverflow,但我不知道还有什么地方可以问。我正在研究证明需求规范一致性的B方法,在指定操作的前提条件时,我对逻辑数学表示法有一个问题 简化原始问题,我有一个变量,它是FLIGHT_nox TIME x TIME之间笛卡尔乘积的子集flights,其中对于每个成员(NO,td,ta),NO表示航班数量,td表示出发时间,ta表示到达时间。我如何使用数学逻辑表示法获得具有最大td值的flights元素?您想要获得这样的元素,还是测试您拥有的元素是否满足此属性?我这样问是因为第二个条件似乎是手术的合理前提。我不知道具体的B法;我看了一些文件,但找不到快速参考,所以在某些细节上可能是错误的 第二个投影应如下所示(Math AMN与数学逻辑符号,math,requirements,software-quality,b-method,Math,Requirements,Software Quality,B Method,我不确定这是否适合stackoverflow,但我不知道还有什么地方可以问。我正在研究证明需求规范一致性的B方法,在指定操作的前提条件时,我对逻辑数学表示法有一个问题 简化原始问题,我有一个变量,它是FLIGHT_nox TIME x TIME之间笛卡尔乘积的子集flights,其中对于每个成员(NO,td,ta),NO表示航班数量,td表示出发时间,ta表示到达时间。我如何使用数学逻辑表示法获得具有最大td值的flights元素?您想要获得这样的元素,还是测试您拥有的元素是否满足此属性?我这样
prj2
用于第二个投影):
第一个问题是:
flightWithGreatestTd = choice({flight | HasGreatestTd(flight)})
请原谅我的无知,我不熟悉B法。但是你不能用唯一性量词吗?它看起来像: 存在一个时间td,使得对于所有时间td',td>td' 及 对于所有td,td',td'',如果td>td''和td'>td'',则td==td'
当然,这是假设集合中只有一个元素。我真的不知道B方法是否允许一阶逻辑的全部功能,但我假设您可以接近这一点。可以在B中定义函数。函数具有常量值,将在ABSTRACT_CONSTANTS子句中列出,并在PROPERTIES子句中定义。我试着解释一下你如何使用这个结构来解决你的问题 下面是一个小摘录,其中
属性
//打字
航班号:航班号信息-->航班号&
航班起飞:航班信息-->时间&
航班到达:航班信息-->时间&
最后一次航班:POW1(航班信息)-->航班信息&
//价值观
航班号=%(否,dt,at)。(否|->dt |->at:航班号)&
航班起飞=%(否,dt,at)。(否|->dt |->at:航班信息| dt)&
航班到达率=%(否,dt,at)。(否|->dt |->at:航班信息| at)&
!fs.(fs:POW1(航班信息)=>
末班机(fs):fs&
!(fi)。(fi:FLIGHT_信息和fi:fs=>
航班离港(fi)Stackoverflow是这个问题的合适论坛,但正式方法问题(主观方法问题除外,批评者可能会表达他们的厌恶)过去一直没有收到及时的答案。祝你好运……我想出了一个与你的答案类似的解决方案。但我在AMN中找不到投影功能,因为在实际问题中,飞行是八组(而不是三组)笛卡尔积的一个子集,这使得编写变得非常困难…我在我使用的软件(工作室B)中发现了投影,但它仅用于关系。我应该制作prj2(prj2(prj2航班)吗例如,如果我想访问flights的第4个字段?它是否像lisp中的列表一样工作?应该有更简单的方法来执行此xD,我可能会查看阵列。实际上,我认为您应该查看使用记录而不是阵列。我可以,但我从来没有听说过AMN上下文中的记录。我想我看到过提到它们,但我不能现在就开始。注意,你甚至没有提到flights
变量。是的,这是一个很容易纠正的错误,但仍然是一个错误。我们差不多在同一时间发布了,当我看到你的时,我投了更高的票,因为它可能比我的好。
flightWithGreatestTd = choice({flight | HasGreatestTd(flight)})
DEFINITIONS
FLIGHT_INFO == FLIGHT_NO * TIME * TIME
CONSTANTS
flight_no, flight_departure, flight_arrival, last_flight
PROPERTIES
// typing
flight_no: FLIGHT_INFO --> FLIGHT_NO &
flight_departure: FLIGHT_INFO --> TIME &
flight_arrival: FLIGHT_INFO --> TIME &
last_flight : POW1(FLIGHT_INFO) --> FLIGHT_INFO &
// value
flight_no = %(no, dt, at).(no |-> dt |-> at : FLIGHT_INFO | no) &
flight_departure = %(no, dt, at).(no |-> dt |-> at : FLIGHT_INFO | dt) &
flight_arrival = %(no, dt, at).(no |-> dt |-> at : FLIGHT_INFO | at) &
!fs.(fs : POW1(FLIGHT_INFO) =>
last_flight(fs) : fs &
!(fi).(fi : FLIGHT_INFO & fi : fs =>
flight_departure(fi) <= flight_departure(last_flight(fs)))