我不确定这是否适用于stackoverflow,但我不知道在哪里提问。我正在研究B方法以证明需求规格的一致性,并且我在指定操作的前提条件时遇到了逻辑数学符号的问题。
简化原始问题,我有一个变量,它是FLIGHT_NO x TIME x TIME之间的笛卡尔积的子集flights,其中对于每个成员(no、td、ta),no表示航班号,td表示出发时间,ta表示到达时间。如何使用数学逻辑符号获取flights中具有最大td值的元素?
我不确定这是否适用于stackoverflow,但我不知道在哪里提问。我正在研究B方法以证明需求规格的一致性,并且我在指定操作的前提条件时遇到了逻辑数学符号的问题。
简化原始问题,我有一个变量,它是FLIGHT_NO x TIME x TIME之间的笛卡尔积的子集flights,其中对于每个成员(no、td、ta),no表示航班号,td表示出发时间,ta表示到达时间。如何使用数学逻辑符号获取flights中具有最大td值的元素?
HasGreatestTd(flight) = flight \in flights \and \forall flight' (flight' \in flights => prj2(flight) >= prj2(flight'))
flightWithGreatestTd = choice({flight | HasGreatestTd(flight)})
请原谅我的无知,我不熟悉B-Method。但是你不能使用唯一性量词吗?它看起来像:
存在一个时间td,使得对于所有的时间td',td > td'
和
对于所有的td、td'、td'',如果td > td''且td' > td'',那么td == td'
当然,这假设集合中恰好有一个元素。我无法确定B-Method是否允许完全使用一阶逻辑,但我认为你可以接近这个目标。
在B语言中可以定义函数。函数具有常量值,并应列在ABSTRACT_CONSTANTS子句中,在PROPERTIES子句中定义。我尝试解释如何使用此结构来解决您的问题。
以下是一个小节选,其中
声明了四个常量,前三个是“访问器”,最后一个将非空的航班信息集映射到具有最大出发时间的航班信息。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)))