2014-03-19 35 views
1

我有一個問題如下:活動B總功能

小學班包含了一些兒童和各種書籍。寫一個跟蹤孩子讀過的書的模型。它應該保持兒童與書籍之間的關係。還應該處理以下事件:

記錄:增加的事實,給孩子閱讀給定書

newbook:輸出一書中說,鑑於孩子沒有讀過

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" 

我有這個但t不行,我不知道現在該做什麼。誰能幫我

grd3: rbook(name) = ∅ 
+0

我不認爲這應該被標記爲形式語言(形式語言涉及常規語言,上下文無關語言等),而是這是關於如何通過一些規則來表示語義數據庫。 – justhalf

回答

1

rbook只是一本書,但你正在使用就好像它是一個函數。你的意思是readBooks(name) = {}?如果是的話,這個陳述仍然是「這個學生從來沒有讀過書嗎?」。

第一個問題可能是在readBooks的定義中。你將它建模爲從學生到書籍的全部功能。這意味着每個學生都只讀了一本書。這可能不是你想要表達的。要指出,每一個學生讀過書的任意數,你可以學生映射到帳套:

readBooks : students --> POW(books) 

的保護將是rbook /: readBooks(name)

就我個人而言,我寧願在這種情況下的關係,他們通常更容易應付。這裏一對s|->b將是readBooks如果學生s已讀的書B:

readBooks : students <-> books 

在這種情況下,後衛會name|->rbook /: readBooks