2017-01-29 8 views
0

以下は、電子メールアドレス帳の合金モデルです。アドレス帳の各名前は、名前またはアドレスのいずれかにマッピングされます。私のアサーションが実際にチェックしたいものをチェックしていることを確認するにはどうすればいいですか?

それぞれの名前を最終的にアドレスにマッピングする必要があります(例:Family - > Tom - > Tom_addr)。私はこれを実装するための事実を作りました。私の事実が正しいことを確認するために、私はアサルトを作成しました。

私はアサルトに何を配置するかについて長い間困惑していました。奇妙なことに、私が「事実」セクションに置いた表現は、アサルトに置く正しい表現のように思えます。しかし、その主張はただの事実を繰り返すだけであり、それは役に立たない。だから私は主張に置くべき何かを作った。

"assert"セクションに置かれたものが実際にはすべての名前が最終的にアドレスにマッピングされることを実際に確認しているとは確信していません。

質問:「事実」セクションで

は、私が正しく、それぞれの名前が、最終的アドレスにマップ制約を表明していますか?

"assert"セクションでは、すべての名前が最終的にアドレスにマップされることを示す良い方法がありますか?

sig Addr {} 

sig Name { 
    address: some Addr + Name 
} 

fact { 
    // No cycles. 
    no n: Name | n in n.^address 

    // All names eventually map to an Addr. 
    // Here's how I implemented the constraint: 
    // There is no name n that is mapped-to (i.e., m -> n), 
    // which does not map-to something (i.e., n -> p). 
    no n: Name { 
     n in univ.address 
     n not in address.univ 
    } 
} 

assert All_names_eventually_map_to_an_Addr { 
    all n: Name | some n.^address & Addr 
} 

check All_names_eventually_map_to_an_Addr 

答えて

1

アサーションは、実際には有用であるとは思わないものです。 (仮定の下で財産を証明/チェックを考える - フォーム(QとP)の含意はPは明らかに任意のPQのために保持している意味。)

は、それは言っても、プロパティを:あなたのコードスニペットで与えられる

すべての名前は、最終的にアドレス

にマップが正しく、表現しなければなりません。 (閉包は、Addressの関係のためにaddressが定義されていないので、Addressの1つの要素にしかマップできません。

関連する問題