事件B总功能

时间:2014-03-19 00:07:55

标签: event-b

我有一个问题如下:

小学班级包含许多孩子和各种书籍。写一个模型,跟踪孩子们读过的书。它应该保持儿童和书籍之间的关系。它还应该处理以下事件:

记录:添加了给定孩子已阅读给定图书的事实

新书输出一本给定孩子尚未阅读的书

books_query:输出给定孩子已阅读的图书数量

到目前为止,这是我的模型

CONTEXT  
    booksContext
SETS
    STUDENTS
    BOOKS

CONSTANTS
    student
    book
AXIOMS
    axm1: partition(STUDENTS, {student})
    axm2: partition(BOOKS,{book})

我的机器如下:

MACHINE
    books
SEES
    booksContext
VARIABLES
    students
    books
    readBooks
INVARIANTS
    students ⊆ STUDENTS
    books ⊆ BOOKS
    readBooks ∈ students → books

我有一个活动,我希望将一本书标记为给定学生的读物。它有两个参数:学生的名字和书的名称。

EVENTS
  record

  ANY
    rbook
    name
  grd1: rbook ∈ books
  grd2: name ∈ students

现在为守卫。我想说

"If the student has not read the book already"

我有这个但是没有用,我现在不知道该怎么办。任何人都可以帮助我

grd3: rbook(name) = ∅

1 个答案:

答案 0 :(得分:1)

rbook只是一本书,但你使用的就好像它是一个函数。你的意思是readBooks(name) = {}?如果是,该陈述仍然是"学生是否从未读过书?"。

第一个问题可能出在readBooks的定义中。您将其建模为从学生到书籍的总功能。这意味着每个学生都读过一本书。这可能不是你想要表达的。要说明每个学生都阅读了任意数量的书籍,您可以将学生映射到书籍集:

readBooks : students --> POW(books)

守卫将是rbook /: readBooks(name)

我个人更喜欢在这种情况下的关系,他们通常更容易应付。如果学生已经阅读了书b:

,那么s|->b对将在readBooks
readBooks : students <-> books

在这种情况下,警卫将是name|->rbook /: readBooks