Платформа Родена Event-B, отношение Подмножества моделирования

Я новичок в Event-B, и я пытаюсь смоделировать машину, где набор PERSONNE включает в себя набор CLIENT, который включает в себя набор RESIDENT... Я искал документацию Родена, но ничего не нашел.. Вот контекст

context contexteHumain

sets PERSONNE CLIENT RESIDENT

axioms
  @axm1; finite(PERSONNE)
  @axm2; finite(CLIENT)
  @axm3; finite(RESIDENT) // Definition of three possible sets

а вот и машина

machine machineFunKeyHotel sees contexteHumain

variables
    pers
    reserv
    cli
    resid
    chkin
    chkout

invariants
    @inv1: pers ⊆ PERSONNE
    @inv2: cli ⊆ CLIENT
    @inv3: resid ⊆ RESIDENT
// Définis les 3 variables d'ensemble de Personnes, Clients et Résidents
    @inv4: reserv ∈ BOOL
    @inv5: chkin ∈ BOOL
    @inv6: chkout ∈ BOOL
// Les paramètres booléens si la ⦂personne a réservé, check-in ou check-out.
    @inv7: CLIENT ⊆ PERSONNE
    @inv8: RESIDENT ⊆ CLIENT
// Et les relations entre les différnets ensembles d'humains·

events
  event INITIALISATION
  begin
    @act1: reserv ≔ FALSE
    @act2: chkin ≔ FALSE
    @act3: chkout ≔ FALSE
// Ces valeurs sont à faux, en effet, au début personne n'a ni réservé ni check-in
// Encore moins check out.
    @act4: resid ≔ ∅
    @act5: cli ≔ ∅
// Au début le nombre de client et de résidents sont zéro
    @act6: pers ≔ ∅ //???
// Définir un nombre de personne presqu'infini (Personnes sur terre estimé à
// 7 290 477 807 personnes le vendredi 3 avril 2015 à 9 h 07 min et 24 s (GTM +1)
  end

  event réserver
// Lorsqu'une personne quelconque a réservé ça implique quelle soit ajoutée
// à l'ensemble clients.
    any potentiel_client
    where
      @gr1: potentiel_client ∈ PERSONNE
      @gr2: reserv = TRUE
    then
      @act1: cli ≔ cli ∪ {potentiel_client}
  end

  event checkerin
// Lorsqu'un client a passé l'étape de check-in, cela implique qu'il est ajouté
// à l'ensemble résident
    any futur_resident
    where
      @gr1: futur_resident ∈ CLIENT
      @gr2: chkin = TRUE
    then
      @act1: resid ≔ resid ∪ {futur_resident}
  end

  event checkerout
// Lorsqu'un résident a procédé au check out cela implique qu'il est retiré
// et de l'ensemble client et de l'ensemble résident.
    any resident_actuel
    where
      @gr1: resident_actuel ∈ RESIDENT
      @gr2: chkout = TRUE
    then
      @act1: resid ≔ resid ∖ {resident_actuel}
      @act2: cli ≔ cli ∖ {resident_actuel}
  end
end

Я думаю, у меня есть идея, но я не могу решить, как решить различные ошибки, которые я получаю: типы CLIENT и PERSONNE не совпадают (3 раза) Типы RESIDENT и CLIENT не совпадают (2 раза)...

1 ответ

В вашей спецификации есть проблема, которая очень часто встречается у новичков в Event-B.:)

Вы ввели три отложенных набора PERSONNE, CLIENT а также RESIDENT, Но я думаю, что клиент или резидент тоже люди. И все отложенные наборы являются константами, поэтому с этой конструкцией вы не сможете изменять свой набор клиентов или резидентов.

Я думаю, что основной проблемой является ключевое слово SETS, Вам не нужно указывать все комплекты вашей машины там. Считать TYPES! Вы просто вводите новый тип (я думаю, что вам нужно только PERSONNE здесь) и есть константа для всех элементов.

context contexteHumain
sets PERSONNE

Так что снимайте наборы CLIENT а также RESIDENT, Я бы посоветовал удалить все аксиомы тоже. Вы действительно должны предполагать, что множество возможных людей конечно?

Адаптируйте ваши инварианты:

invariants
  @inv1: pers ⊆ PERSONNE
  @inv2: cli ⊆ pers
  @inv3: resid ⊆ cli

Удалить inv7 а также inv8, Возможно, вы захотите добавить инвариант, чтобы набор людей в вашей системе был конечным (в отличие от всех возможных людей в PERSONNE):

@inv9: finite(pers)

Соответственно, вы бы адаптировали своих охранников:

@gr1: futur_resident ∈ cli

соответственно

@gr1: resident_actuel ∈ res
Другие вопросы по тегам