食堂の哲学者の問題では、哲学者とフォークのテーブルがあります。合金の関係を構築する
P1 -> F1
F1 -> P2
P2 -> F2
F2 -> P3
P3 -> F3
F3 -> P1
すなわち:私はテーブルを表し、次の関係を望んでこの問題については
sig P {}
sig F {}
各PはFを指し、各FはPを指し、これは円を形成する。私はこの関係を取得するための関数を呼び出すしたいと思います:
fun table : (P+F) one -> one (P+F) { ... }
私はこの仕事をするために努力してきたが、私はまた私が午前他の問題に関連しているという根本的な何かが欠けていますようにそれは感じています。どういうわけか私は 'コンストラクター'が欠けています。
任意のポインタ?
追加
@Hovercouchは、ヘルパーsig
とワーキング溶液を得ました。しかし、これにはPとFの非自然拡張が必要で、新しいsig
が導入されました。非天然の継承の問題に対処
sig P, F {}
one sig Table {
setting : (P+F) one -> one (P+F)
} {
# P = # F
all p : P, f : F | P in p.^setting and F in f.^setting
}
run {} for 6
:これもによって解決することができます。
しかし、それはまだ非常にグローバルな問題と非常に単純な問題のために多くの仕事のようです。他のソリューションがあるかどうかを確認するために質問を開いたままにします。
ありがとう、良い解決策。しかし、私のコードにはたくさんの不動産が必要ですか?また、PおよびFに対して非自然拡張を必要とする。彼らの次の性格はテーブル設定の側面であり、PやFの側面ではありません。(OOではこれはコードの悪臭です) –