Math AMN与数学逻辑符号

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元素?您想要获得这样的元素,还是测试您拥有的元素是否满足此属性?我这样

我不确定这是否适合stackoverflow,但我不知道还有什么地方可以问。我正在研究证明需求规范一致性的B方法,在指定操作的前提条件时,我对逻辑数学表示法有一个问题

简化原始问题,我有一个变量,它是FLIGHT_nox TIME x TIME之间笛卡尔乘积的子集flights,其中对于每个成员(NO,td,ta),NO表示航班数量,td表示出发时间,ta表示到达时间。我如何使用数学逻辑表示法获得具有最大td值的flights元素?

您想要获得这样的元素,还是测试您拥有的元素是否满足此属性?我这样问是因为第二个条件似乎是手术的合理前提。我不知道具体的B法;我看了一些文件,但找不到快速参考,所以在某些细节上可能是错误的

第二个投影应如下所示(
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子句中定义。我试着解释一下你如何使用这个结构来解决你的问题

下面是一个小摘录,其中

  • 介绍了给出航班信息的笛卡尔积的快捷方式
  • 声明了四个常量,前三个是“访问器”,最后一个常量将一组非空的航班信息映射到离港时间最大的航班信息
  • 然后将这些常量类型化并定义为total函数。请注意,最后一个函数必须采用非空集作为输入。在这里,我使用了不同的方法来指定这些函数。一个是定义的(带有等式),另一个是公理的
  • 属性
    //打字
    航班号:航班号信息-->航班号&
    航班起飞:航班信息-->时间&
    航班到达:航班信息-->时间&
    最后一次航班: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)))