bag은 여러 번 발생하는 요소의 모음입니다. Temporal Logic of Actions (TLA+)에있는 표준 모듈 Bags
에는 bag에 해당하는 수학적 정의가 들어 있습니다.
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 +로 작성되었습니다. y
를 생략하는 것은 BDD에 대응로 돌려한다 가방 각 요소 (들 중 적어도 하나 개를 발생하는 것을 포함하고 있기 때문에
는
상기 실제로 그래서 y
전혀 발생 이것이 가방 없다는 것을 의미하지 가방 아니다 가방). 가방이 제품군에 적합한 표현인지 여부는 별도의 관심사이며, 여기서는 다루지 않을 것입니다.
코드를 적용하여 두 번째 그림에 표시된 BDD에 대한 수식을 확인할 수 있습니다.
아래 코드는 Python 패키지 omega == 0.1.1
과 dd == 0.5.1
(면책 조항 : 나는 이들의 작성자입니다)을 사용합니다. 이것들은 순수 Python에서 작동합니다.이 크기의 BDD 만 있으면 충분합니다 (그렇지 않으면 dd.cudd
을 작성하면 CUDD
을 사용할 수 있습니다. 물론 손으로 쓸 수있는 BDD의 경우에는 아무런 차이가 없습니다).
#!/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
함께 설치 될 수있다 : 위의 코드에서 수행 같은 변수의 수치를 재정렬함으로써
pip install dd==0.5.1
pip install omega==0.1.1
, 우리는 더 작은 (RO) BDD를 얻을 수있다 :
위의 BDD는 negated edges을 사용하여 표현되며, 이에 대해서는 tutorial on BDDs에서 설명합니다.
"제품군"이란 무엇입니까? –
관심을 가져 주셔서 감사합니다. 여기에있는 제품군은 제품에있는 일련의 기능으로 간주 될 수 있습니다. 가방 모델에서 우리는 또한 제품의 기능과 함께 발생을 고려합니다. –
도움이된다면 유사한 개념을 지닌이 링크가 있습니다 https://pdfs.semanticscholar.org/2f6b/c6a5b5d78906e4ff98d3ea883963dbb1ed6a.pdf –