Пример #1
0
def test_names():

    good = ["a", "b", "name", "complex_name", "proposition10"]
    bad = ["Future", "X", "$", "", "40a", "niceName"]

    for name in good:
        str(LTLfAtomic(name)) == name

    for name in bad:
        with pytest.raises(ValueError):
            str(LTLfAtomic(name)) == name
Пример #2
0
def test_QuotedFormula():
    from ltlf2dfa.base import QuotedFormula
    from ltlf2dfa.ltlf import LTLfAnd, LTLfAtomic
    from ltlf2dfa.parser.ltlf import LTLfParser

    f = LTLfParser()("!(G a)")
    qf = QuotedFormula(f)
    atomf = LTLfAnd([LTLfAtomic(f), LTLfAtomic(f)])

    assert qf.wrapped is f

    dir_qf = dir(qf)
    for member in dir(f):
        assert member in dir_qf
        assert hasattr(qf, member)
Пример #3
0
def test_mona():
    parser = LTLfParser()
    a, b, c = [LTLfAtomic(c) for c in "abc"]
    tt = LTLfTrue()
    ff = LTLfFalse()

    assert a.to_mona(v="0") == "(0 in A)"
    assert b.to_mona(v="0") == "(0 in B)"
    assert c.to_mona(v="0") == "(0 in C)"
    assert tt.to_mona(v="0") == "true"
    assert ff.to_mona(v="0") == "false"

    f = parser("!(a & !b)")
    assert f.to_mona(v="0") == "~(((0 in A) & ~((0 in B))))"

    f = parser("!(!a | b)")
    assert f.to_mona(v="0") == "~((~((0 in A)) | (0 in B)))"

    f = parser("!(a <-> b)")
    assert (f.to_nnf().to_mona(
        v="0") == "((~((0 in A)) | ~((0 in B))) & ((0 in A) | (0 in B)))")

    # Next and Weak Next
    f = parser("X(a & b)")
    assert f.to_mona(v="0") == "(ex1 v_1: v_1=1 & ((v_1 in A) & (v_1 in B)))"

    f = parser("WX (a & b)")
    assert (f.to_mona(v="0") ==
            "((0 = max($)) | (ex1 v_1: v_1=1 & ((v_1 in A) & (v_1 in B))))")

    # Until and Release
    f = parser("a U b")
    assert (
        f.to_mona(v="0") ==
        "(ex1 v_1: 0<=v_1&v_1<=max($) & (v_1 in B) & (all1 v_2: 0<=v_2&v_2<v_1"
        " => (v_2 in A)))")
    f = parser("a R b")
    assert (
        f.to_mona(v="0") ==
        "((ex1 v_1: 0<=v_1&v_1<=max($) & (v_1 in A) & (all1 v_2: 0<=v_2&v_2<=v_1"
        " => (v_2 in B))) | (all1 v_2: 0<=v_2&v_2<=max($) => (v_2 in B)))")

    # Eventually and Always
    f = parser("F(a & b)")
    assert (
        f.to_mona(v="0") ==
        "(ex1 v_1: 0<=v_1&v_1<=max($) & ((v_1 in A) & (v_1 in B)) & (all1 v_2: "
        "0<=v_2&v_2<v_1 => true))")
    f = parser("G(a | b)")
    assert (
        f.to_mona(v="0") ==
        "((ex1 v_1: 0<=v_1&v_1<=max($) & false & (all1 v_2: 0<=v_2&v_2<=v_1 => "
        "((v_2 in A) | (v_2 in B)))) | (all1 v_2: 0<=v_2&v_2<=max($) => ((v_2 in A) "
        "| (v_2 in B))))")
Пример #4
0
def test_parser():
    parser = LTLfParser()
    a, b, c = [LTLfAtomic(c) for c in "abc"]

    assert parser("!a | b <-> !(a & !b) <-> a->b") == LTLfEquivalence([
        LTLfOr([LTLfNot(a), b]),
        LTLfNot(LTLfAnd([a, LTLfNot(b)])),
        LTLfImplies([a, b]),
    ])

    assert parser("(X a) & (WX !b)") == LTLfAnd(
        [LTLfNext(a), LTLfWeakNext(LTLfNot(b))])

    assert parser("(F (a&b)) <-> !(G (!a | !b) )") == LTLfEquivalence([
        LTLfEventually(LTLfAnd([a, b])),
        LTLfNot(LTLfAlways(LTLfOr([LTLfNot(a), LTLfNot(b)]))),
    ])

    assert parser("(a U b U c) <-> !(!a R !b R !c)") == LTLfEquivalence([
        LTLfUntil([a, b, c]),
        LTLfNot(LTLfRelease([LTLfNot(a), LTLfNot(b),
                             LTLfNot(c)])),
    ])
Пример #5
0
def test_nnf():
    parser = LTLfParser()
    a, b, c = [LTLfAtomic(c) for c in "abc"]

    f = parser("!(a & !b)")
    assert f.to_nnf() == LTLfOr([LTLfNot(a), b])

    f = parser("!(!a | b)")
    assert f.to_nnf() == LTLfAnd([a, LTLfNot(b)])

    f = parser("!(a <-> b)")
    assert f.to_nnf() == LTLfAnd(
        [LTLfOr([LTLfNot(a), LTLfNot(b)]),
         LTLfOr([a, b])])

    # Next and Weak Next
    f = parser("!(X (a & b))")
    assert f.to_nnf() == LTLfWeakNext(LTLfOr([LTLfNot(a), LTLfNot(b)]))

    f = parser("!(WX (a & b))")
    assert f.to_nnf() == LTLfNext(LTLfOr([LTLfNot(a), LTLfNot(b)]))

    # Eventually and Always
    f = parser("!(F (a | b))")
    assert f.to_nnf() == LTLfAlways(LTLfAnd([LTLfNot(a), LTLfNot(b)])).to_nnf()

    # Until and Release
    f = parser("!(a U b)")
    assert f.to_nnf() == LTLfRelease([LTLfNot(a), LTLfNot(b)])
    f = parser("!(a R b)")
    assert f.to_nnf() == LTLfUntil([LTLfNot(a), LTLfNot(b)])

    f = parser("!(F (a | b))")
    assert f.to_nnf() == LTLfAlways(LTLfAnd([LTLfNot(a), LTLfNot(b)])).to_nnf()
    f = parser("!(G (a | b))")
    assert f.to_nnf() == LTLfEventually(LTLfAnd([LTLfNot(a),
                                                 LTLfNot(b)])).to_nnf()
Пример #6
0
 def ltlf_symbol(self, args):
     """Parse LTLf Symbol."""
     assert len(args) == 1
     token = args[0]
     symbol = str(token)
     return LTLfAtomic(symbol)
Пример #7
0
def set_next_aux_lit(rep, rep2lit):
    aux_name = "l_{}".format(len(rep2lit))
    aux_atom = LTLfAtomic(aux_name)
    rep2lit[rep] = aux_atom
    return aux_atom