こんにちは、無限の普遍的な数量を扱うとき、私は合金で問題が発生してきた合金 - 無制限の普遍的な数量で
ディーリング。ダニエル・ジャクソンの本「ソフトウェア抽象化」(第5.3節「無限大の量的限定子」)で説明されているように、Alloyは普遍的な量限定子とアサーションの検査に関して微妙な制限があります。合金は、セットが(前述の本の中で示されている)組合下で閉じていることを確認するためにそのような次のようないくつかの場合には偽反例を生成する:
ような反例製造sig Set {
elements: set Element
}
sig Element {}
assert Closed {
all s0, s1: Set | some s2: Set |
s2.elements = s0.elements + s1.elements
}
check Closed for 3
:
Set = {(S0),(S1)}
Element = {(E0),(E1)}
s0 = {(S0)}
s1 = {(S1)}
elements = {(S0,E0), (S1,E1)}
アナライザは十分な値(S0とS1の和集合を含むSet atom S2がない)をSetに設定しませんでした。この一般的な問題へ
2つの溶液を本の中で、次に提案されています
1)すべての可能なインスタンスを生成する合金を強制的に発電機の公理を宣言します。例えば :
fact SetGenerator{
some s: Set | no s.elements
all s: Set, e: Element |
some s': Set | s'.elements = s.elements + e
}
この解決策は、しかし、スコープ爆発を生成し、また不整合をもたらし得ます。
2)ジェネレータの公理を省略し、束縛されたユニバーサル形式を制約のために使用する。つまり、定量化された変数の境界式には生成されたシグネチャの名前は含まれていません。しかし、すべてのアサーションがこのような形式で表現されるわけではありません。
私の質問です:これらのソリューションを選択する際の具体的なルールはありますか?この本から私には分かりません。
ありがとうございました。
ありがとうございました。私が念頭に置いている例は、一連の状態として明示的には定義されていないが、これらの状態につながる規則で定義される動作モデルです。私がしようとしているのは、これらの状態(例えば述語 'p'は生成されたすべての状態に対して常に満たされている)などの汎用量指定子を含むアサーションをチェックすることです。 –
いくつかの変更を加えた後、私は、汎用量子を使って述語を存在量限定子を使って変換することができました。これは正しく動作するようです。再度、感謝します! –