2016-02-27 8 views
1

下面是签名合金:使用“in”和得到错误“在只能在同一元数的2个表达之间使用”

one sig Library { 
    books: set Book,         
    patrons: set Patron,        
    circulation: Patron lone -> some Book 
} 

sig Book { } 

sig Patron { 
    curbooks: set Book 
} 

问题 - >我想要做的是:写一个事实,即目前有靠山的书都占在图书馆的流通关系现在

fact curPatronBooksConsistent { 
     lone l : Library | all b : l.patrons.curbooks | b in l.circulation 
} 

我明白错误的性质:在只能使用同一个元素的2个表达式之间。

Left type = this/Book 
Right type = this/Patron->this/Book 

但是我不知道该怎么也可以找到只返回一个的与该library.circulation相关书籍“设置”中的任何实例。我意识到这不是一个集合,而是一种关系,所以我如何在Alloy中表达这种关系?

都属于食客例如书籍所有p.curbooks都映射在l.circulation中?

谢谢大家提前。

回答

1

欢迎堆栈溢出。你说

However I do not know how to nor can I find any examples of returning only a "set" of books that are associated with the library.circulation.

再看看dot(join)操作符的讨论;你应该找到很多例子。关系circulation是一个三元关系图书馆 - >守护神 - >图书。表达式l.circulation执行加入并降低了元数,产生关系赞助人 - >簿。

你如何得到表单赞助人的关系 - >预订一套书?

一个显而易见的方法是将其与像Patron.(l.circulation)表达加入一组赞助的。这可能不是你想要的 - 你可能想说的是,每个书中显示的一些赞助人的curbooks不仅仅是一些赞助人,而是那个特别的赞助人。

相关问题