以下是签名
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
}
现在我理解了错误的本质:in只能在同一个arity的两个表达式之间使用。
Left type = this/Book
Right type = this/Patron->this/Book
但是我不知道怎么做也不能找到任何只返回" set"与library.circulation相关的书籍。我意识到这不是一个集合而是一个关系,所以我如何在Alloy中表达它?
属于顾客的所有书籍,例如所有的p.curbooks都映射在l.circulation中?
提前谢谢大家。
答案 0 :(得分:1)
欢迎使用Stack Overflow。你说
但是我不知道如何找到任何只返回与图书馆相关的“一套”书籍的例子。
再看一下dot(join)运算符的讨论;你应该找到很多例子。关系circulation
是三元关系库 - >赞助人 - >书。你的表达式l.circulation
执行连接并减少arity,产生关系Patron - >书。
如何获得Patron形式的关系 - >预订一套书?
一种显而易见的方法是将其加入一组带有Patron.(l.circulation)
表达式的顾客。这可能不是你想要的 - 你可能想说,在一些赞助人的curbooks
中显示的每本书都不仅仅是某些赞助人,而是那个特定的> 他们是赞助人。