我有一个问题如下:
小学班级包含许多孩子和各种书籍。写一个模型,跟踪孩子们读过的书。它应该保持儿童和书籍之间的关系。它还应该处理以下事件:
记录:添加了给定孩子已阅读给定图书的事实
新书输出一本给定孩子尚未阅读的书
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) = ∅
答案 0 :(得分:1)
rbook
只是一本书,但你使用的就好像它是一个函数。你的意思是readBooks(name) = {}
?如果是,该陈述仍然是"学生是否从未读过书?"。
第一个问题可能出在readBooks
的定义中。您将其建模为从学生到书籍的总功能。这意味着每个学生都读过一本书。这可能不是你想要表达的。要说明每个学生都阅读了任意数量的书籍,您可以将学生映射到书籍集:
readBooks : students --> POW(books)
守卫将是rbook /: readBooks(name)
。
我个人更喜欢在这种情况下的关系,他们通常更容易应付。如果学生已经阅读了书b:
,那么s|->b
对将在readBooks
readBooks : students <-> books
在这种情况下,警卫将是name|->rbook /: readBooks
。