我最近开始尝试用于一个项目的合金,并且遇到了一个问题不均匀的问题。这是一个简单的例子。我有四个特征:合金:用断言检查约束时的问题
- 字
- 定义
- 文件:文件有一个文本(单词序列)
- 字典:字典单词序列映射到一个定义序列(保持简单,让我们说,一个词应该有一个确切的定义)
这里是一个最小的代码示例:
module dictionaries
open util/relation as relation
sig Word {}
sig Definition {}
sig Document {
text: seq Word
}
sig Dictionary {
entries: seq Word,
defseq: seq Definition,
define: Word->Definition,
}{
//dictionary maps word to def only for the word present in dictionary
dom[define] = elems [entries] function [define, elems [entries]]
//content of the list of defintions
defseq = entries.define
}
//assert all word in a dictionary have a definition
assert all_word_defined {
all w: Word | all dict: Dictionary | some def: Definition |
//w in dict.entries implies w->def in dict.define
}
check all_word_defined
所以我的问题是:
如何约束字典,这样的字典映射每个单词只有一个定义?在上面的代码中做它是正确的吗?
如何通过断言检查此约束是否受到尊重?显然的代码位不起作用,因为
w in dict.entries
和w->def in dict.define
不具有相同的参数数量,和我“中,可以使用相同的元数只有2倍之间的表达”得到错误信息......
谢谢您的回复,博客文章!将映射看作表格当然是有用的。我知道我不应该试图断言什么是事实。问题是我正在与别人合作,并且我非常善于创建自己的事实(我可以在实例中看到反例)。所以断言帮助我重新检查我是否正确表达了我的事实!特别是当我得到很多实例,并且我不想点击几百个来查看所有实例是否正确... – Ely
PS:合金分析仪对您的命题“趣味词典”不是很满意。 entries {this.define.univ}'(它告诉我存在语法错误)。 – Ely
你可以把你的模型放在Github上吗? –