def multiple_env_actions_check(solver='omega'): """Two env players, 3 states controlled by sys. sys wins marginally, due to assumption on next combination of actions by env players. """ # 1 <---> 2 # 1 ---> 3 env_actions = [ { 'name': 'env_alice', 'values': transys.MathSet({'left', 'right'}) }, { 'name': 'env_bob', 'values': transys.MathSet({'bleft', 'bright'}) } ] sys = transys.FTS(env_actions) sys.states.add_from({'s1', 's2', 's3'}) sys.states.initial.add_from({'s1'}) sys.add_edge('s1', 's2', env_alice='left', env_bob='bright') sys.add_edge('s2', 's1', env_alice='left', env_bob='bright') # at state 3 sys loses sys.add_edge('s1', 's3', env_alice='right', env_bob='bleft') logging.debug(sys) env_safe = {('(loc = "s1") -> X( (env_alice = "left") && ' '(env_bob = "bright") )')} sys_prog = {'loc = "s1"', 'loc = "s2"'} specs = spec.GRSpec( env_safety=env_safe, sys_prog=sys_prog, moore=False, plus_one=False, qinit='\A \E') r = synth.is_realizable(specs, sys=sys, solver=solver) assert r # slightly relax assumption specs = spec.GRSpec( sys_prog=sys_prog, moore=False, plus_one=False, qinit='\A \E') r = synth.is_realizable(specs, sys=sys, solver=solver) assert not r
def fill_fts(fts): """Add a trap state and direct all outgoing actions to it""" fts.add_node('trap') for node in fts.nodes(): actions = transys.MathSet(attr['sys_actions'] for _, _, attr in fts.transitions.find(node)) for action in fts.sys_actions: if action not in actions: fts.add_edge(node, 'trap', sys_actions=action)