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
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)
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))))")
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)])), ])
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()
def ltlf_symbol(self, args): """Parse LTLf Symbol.""" assert len(args) == 1 token = args[0] symbol = str(token) return LTLfAtomic(symbol)
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