bagは、複数の出現を持つ要素の集合です。 Temporal Logic of Actions (TLA+)の標準モジュールBags
には、バッグに対応する数学的定義が含まれています。
binary decision diagramのグラフを式に変換するには、以下のコードを使用しました。 OPからの最初のBDDの答えは次のとおりです。
/\ b \in 0 .. 7
/\ x \in 0 .. 1
/\ y \in 0 .. 1
/\ z \in 0 .. 1
/\ \/ (b = 0) /\ (y = 1)
\/ (b = 3) /\ (x = 1)
\/ (b = 6) /\ (z = 1)
この式はTLA +で書かれています。
上記実際袋は、各要素の少なくとも1つの存在を含んでいるので、バッグない(そうy
のない発生は、これは袋ではないことを意味し; y
がに対応するBDDにそれを回す必要があり省略しますバッグ)。バッグが製品ファミリーに適したものであるかどうかは別の懸念事項です。
あなたは2番目の図に示したBDDのための式を確認するためのコードを適応させることができます。
以下のコードでは、Pythonパッケージomega == 0.1.1
とdd == 0.5.1
(免責事項:私はそれらの著者です)を使用しています。これらは、純粋なPythonで動作します。このサイズのBDDの場合は十分です(そうでなければ、dd.cudd
をビルドするとCUDD
を使用できます。もちろん手書きで書くには十分小さいBDDでは違いはありません)。依存関係がpip
でインストールすることができる
#!/usr/bin/env python
"""Convert from a BDD figure to a formula."""
from omega.symbolic import fol
# "bare" BDDs (without integers) can be used also
# via the package `dd`
# from dd import autoref as _bdd
# bdd = _bdd.BDD()
ctx = fol.Context()
ctx.declare(x=(0, 1), y=(0, 1), z=(0, 1), b=(0, 7))
bdd = ctx.bdd
# bdd.declare('x', 'y', 'z', 'b1', 'b2', 'b3')
# level of b3
u1 = bdd.add_expr('b_2')
u2 = bdd.add_expr('~ b_2')
# level of b2
u3 = bdd.add_expr('ite(b_1, {u}, False)'.format(u=u1))
u4 = bdd.add_expr('ite(b_1, False, {u})'.format(u=u2))
u5 = bdd.add_expr('ite(b_1, {u1}, {u2})'.format(u1=u1, u2=u2))
u6 = bdd.add_expr('ite(b_1, {u2}, False)'.format(u2=u2))
# level of b1
u7 = bdd.add_expr('ite(b_0, {high}, {low})'.format(
low=u3, high='False'))
u8 = bdd.add_expr('ite(b_0, {high}, {low})'.format(
low=u4, high='False'))
u9 = bdd.add_expr('ite(b_0, {high}, {low})'.format(
low=u5, high='False'))
u10 = bdd.add_expr('ite(b_0, {high}, {low})'.format(
low=u3, high=u6))
u11 = bdd.add_expr('ite(b_0, {high}, {low})'.format(
low='False', high=u6))
u12 = bdd.add_expr('ite(b_0, {high}, {low})'.format(
low=u4, high=u6))
u13 = bdd.add_expr('ite(b_0, {high}, {low})'.format(
low=u5, high=u6))
# level of z
u14 = bdd.add_expr('ite(z_0, {high}, {low})'.format(
low='False', high=u7))
u15 = bdd.add_expr('ite(z_0, {high}, {low})'.format(
low=u8, high=u9))
u16 = bdd.add_expr('ite(z_0, {high}, {low})'.format(
low=u11, high=u10))
u17 = bdd.add_expr('ite(z_0, {high}, {low})'.format(
low=u12, high=u13))
# level of y
u18 = bdd.add_expr('ite(y_0, {high}, {low})'.format(
low=u14, high=u15))
u19 = bdd.add_expr('ite(y_0, {high}, {low})'.format(
low=u16, high=u17))
# level of x
from_fig = bdd.add_expr('ite(x_0, {high}, {low})'.format(
low=u18, high=u19))
# the variable order from the first figure in the OP
levels = dict(x_0=0, y_0=1, z_0=2, b_0=3, b_1=4, b_2=5)
fol._bdd.reorder(bdd, levels)
bdd.dump('foo_1.png', [from_fig])
# a better variable order
levels = dict(b_0=0, b_1=1, b_2=2, x_0=3, y_0=4, z_0=5)
fol._bdd.reorder(bdd, levels)
bdd.dump('foo_2.png', [from_fig])
# Create the BDD directly from an expression
s = '''
\/ (b = 3 /\ x = 1)
\/ (b = 0 /\ y = 1)
\/ (b = 6 /\ z = 1)
'''
from_formula = ctx.add_expr(s)
assert from_formula == from_fig
# print a minimal formula in disjunctive normal form
# use this to covert BDDs to expressions
print(ctx.to_expr(from_fig, show_dom=True))
:
pip install dd==0.5.1
pip install omega==0.1.1
![enter image description here](https://i.stack.imgur.com/wClFq.png)
上記のコードで行われたように、変数のレベルを並べ替えることにより、我々は小さい(RO)BDDを得ることができます
![enter image description here](https://i.stack.imgur.com/PyjVl.png)
上記のBDDはnegated edgesで表され、これはtutorial on BDDsで説明されています。
「製品ファミリ」とは何ですか? –
あなたの関心をお寄せいただきありがとうございます、ここの製品ファミリは、製品が持つ一連の機能と考えることができます。バッグモデルでは、製品内での機能の発生を考慮します。 –
もしも助けがあれば、同様のコンセプトのhttps://pdfs.semanticscholar.org/2f6b/c6a5b5d78906e4ff98d3ea883963dbb1ed6a.pdf –