2

下限多重度someone三項関係のセマンティクスは把握するのが困難です。Software Abstractions (Rev. ed.) pp.79-80 によると、関係は(p.97 も参照)addr: Book -> (Name -> some Addr)と同等である必要があります。all b: Book | b.addr in Name -> some Addrしかし、後者の式は正確には何を意味するのでしょうか? ここで私の想像力は失敗します。そのため、Alloy Analyzer 4.1.0 でいくつかの実験を行いました。このモデルでの含意:

sig Name, Addr {}
sig Book { addr: Name -> some Addr }
assert implication {
 #Book = 0 or all n: Name | some b: Book, a: Addr | n in b.addr.a
}
check implication

成立します (反例は見つかりません)。そのため、Book が存在する場合、各 Name はそれらの Book の少なくとも 1 つに登録されている必要があります。文書化されていないアドレスは許可されており、ブックがなければ、文書化されていない名前も突然許可されているように見えます。

次のモデルでの含意:

sig Name, Addr {}
sig Book { addr: Name some -> Addr }
assert implication {
  #Book = 0 or all a: Addr | some b: Book | #b.addr.a > 0
}
check implication

再び保持します。これは以前のモデルの鏡像です: Book がまったくない場合を除き、文書化されていない Addrs は禁止されています。また、名前の文書化に関する制約はありません。

両方のモデルを組み合わせて、より簡潔に定式化できます。

sig Name, Addr {}
sig Book { addr1: Name -> some Addr, addr2: Name some -> Addr }
assert implications {
  some Book implies Name in Book.addr1.Addr and Addr in Book.addr2[Name]
}
check implications

したがって、Book がある場合、すべてのName がリレーション addr1 に参加し、すべてのAddr が addr2 に参加する必要があります。多重度は同様に動作します。one

下限制約に関する限り、ソフトウェア抽象化とアナライザーはR: A -> (B m -> n C)のような構造について同じ話をしていないようですが、何かを見落としている可能性があります。私が発見した意味は、私が期待していたものではありませんでした。私がまだ発見していない他の奇妙な意味があるかもしれません. ネストされた下限多重度はまったく意味をなさないとますます感じています。私はこれで正しいでしょうか?

4

1 に答える 1

1

最初の例は、長い間私を困惑させました。マップされていない名前がどのインスタンスにも存在しないことに驚きました。ただし、価値があるのは、p. 初版の 78 では、「多重度は単なる省略形であり、標準の制約に置き換えることができます。多重度の制約は

r: A m -> n B

次のように書くことができます

all a: A | n a.r
all b: B | m r.b

これらの書き換えルールの最初のものをステートメントに適用する

all b: Book | b.addr in Name -> some Addr

これは最初のモデル例から導き出されたもので、次のようになります。

all b: Book | all n: Name | some n.(b.addr)

または、「すべての本bと名前nについて、b.addrにnのマッピングがあります」という散文では、少なくとも私の最初の困惑に対処しています。マッピングされていない名前を許可するには、 or のいずれかを記述する必要があります (Whirlwind Tour の後の例のように) 。sig Book { addr: set (Name -> Addr) }sig Book { names: set Name, addr: names -> some Addr}

2 番目の書き換えルール ( mが関係するルール) にはもう少し問題がありました。Name(no m )には明示的な多重度はありません。本を調べて、リレーションのデフォルトの多重度制約 (他のフィールドのデフォルトと同様one) の仕様を見つけるのに時間を費やし、同等の制約を記述するさまざまな方法を試しました。 、デフォルトの多重度制約がないと結論付ける前。代わりに、デフォルトでは、多重度の制約はありません。したがって、p で指定された 2 番目の書き換え規則。78 には適用されませんName -> some Addr。多重度の制約はなく、その効果は Addr の各aに対して、 (b.addr).aのインスタンスが 0 個以上存在する場合があります。

set言語設計の観点から、明示的な「デフォルトの多重度制約」を持ち、次のようなステートメントを許可すると役立つと思います

all b: Book | all a: Addr | set (b.addr).a
/* currently produces type error */

これは、各アドレスのb.addrに 0 個以上のエントリがある可能性があることを意味します。

someしかし、そのような変化があろうとなかろうと、三元関係の影響とone三元関係の影響を把握するのは難しいと言うのは正しいと思う傾向があります。

于 2012-09-21T18:53:18.217 に答える