合金:使用" in"并且得到错误" in只能在同一个arity的两个表达式之间使用。"

时间:2016-02-27 03:03:10

标签: alloy

以下是签名

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中?

提前谢谢大家。

1 个答案:

答案 0 :(得分:1)

欢迎使用Stack Overflow。你说

  

但是我不知道如何找到任何只返回与图书馆相关的“一套”书籍的例子。

再看一下dot(join)运算符的讨论;你应该找到很多例子。关系circulation是三元关系库 - >赞助人 - >书。你的表达式l.circulation执行连接并减少arity,产生关系Patron - >书。

如何获得Patron形式的关系 - >预订一套书?

一种显而易见的方法是将其加入一组带有Patron.(l.circulation)表达式的顾客。这可能不是你想要的 - 你可能想说,在一些赞助人的curbooks中显示的每本书都不仅仅是某些赞助人,而是那个特定的