Pregunta

No estoy seguro de que esto es apropiado para stackoverflow, pero no sé a quién más preguntar. Estoy estudiando el B-Método para probar la consistencia en las especificaciones de requisitos, y tengo un problema con la notación matemática lógica al especificar las condiciones previas de las operaciones.

La simplificación del problema original, tengo una variable que es un subconjunto vuelos del producto cartesiano entre FLIGHT_NO x Tiempo x Tiempo, donde por cada miembro (no, td, ta), no significa que el número del vuelo, td el momento de la salida y la TME ta de llegada. ¿Cómo puedo obtener, usando la notación de la lógica matemática, el elemento de vuelos que tiene el mayor valor de td?

¿Fue útil?

Solución

¿Quieres get un elemento de este tipo, o para test que un elemento que tiene satisface esta propiedad? Me pregunto porque el segundo parece un requisito razonable para una operación. No sé el B-Método específicamente; He mirado en algunos documentos, pero no puedo encontrar una referencia rápida, así que esto puede estar equivocado en algunos detalles.

El segundo debe tener este aspecto (prj2 se utiliza para la segunda proyección):

HasGreatestTd(flight) = flight \in flights \and \forall flight' (flight' \in flights => prj2(flight) >= prj2(flight'))

A continuación, la primera es:

flightWithGreatestTd = choice({flight | HasGreatestTd(flight)})

Otros consejos

Perdona mi ignorancia, no estoy familiarizado con el B-Método. Pero no se puede utilizar el cuantificador singularidad? Se vería algo como:

existe un tiempo td de tal manera que para todos los tiempos de TD, TD> td '

y

para todos td, td ', td '', si td> td '' y td> td '', entonces td == td'

Esto, por supuesto, se supone que no es exactamente un elemento en el conjunto. Realmente no puedo decir si el B-Método permite la plena potencia de la lógica de primer orden, pero supongo que podría acercarse a este.

Es posible definir funciones en B. Las funciones tienen valores constantes y son para ser enumeradas en la cláusula ABSTRACT_CONSTANTS, y se define en la cláusula PROPERTIES. Intento explicar cómo se puede utilizar esta construcción para resolver su problema.

Sigue un pequeño extracto donde

  1. Se introduce un acceso directo para el producto cartesiano de dar información de vuelo;
DEFINITIONS
    FLIGHT_INFO == FLIGHT_NO * TIME * TIME
  1. cuatro constantes se declaran, los tres primeros son "métodos", y el último Asigna un conjunto no vacío de información de vuelo a la información de vuelo con la hora de salida más grande.
CONSTANTS
    flight_no, flight_departure, flight_arrival, last_flight
  1. A continuación, estas constantes se escriben y se definen como funciones totales. Tenga en cuenta que la última función debe tomar como entrada un conjunto no vacío. Aquí he utilizado a diferentes enfoques para especificar estas funciones. Uno de ellos es de definición (con una igualdad), y el otro es un axioma.
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)))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top