@@ -235,13 +235,13 @@ def stop_based_on_confidence(hypothesis, property_based_stopping, print_level=2)
235235 return True
236236
237237
238- def bisimilar (a1 : DeterministicAutomaton , a2 : DeterministicAutomaton , return_cex = False ) -> Union [bool , None , list ]:
238+ def bisimilar (a1 : DeterministicAutomaton , a2 : DeterministicAutomaton , return_cex = False ) -> Union [bool , None , tuple ]:
239239 """
240240 Checks whether the provided automata are bisimilar.
241241 If return_cex the function returns a counter example or None, otherwise a Boolean is returned.
242242
243243 Returns:
244- object:
244+ object: true or false if return_cex is set to False, otherwise None (no counterexample) or a counterexample
245245 """
246246
247247 # TODO allow states as inputs instead of automata
@@ -259,28 +259,26 @@ def bisimilar(a1: DeterministicAutomaton, a2: DeterministicAutomaton, return_cex
259259 to_check : Queue [Tuple [AutomatonState , AutomatonState ]] = Queue ()
260260 to_check .put ((a1 .initial_state , a2 .initial_state ))
261261 requirements = dict ()
262- requirements [(a1 .initial_state , a2 .initial_state )] = []
262+ requirements [(a1 .initial_state , a2 .initial_state )] = ()
263263
264264 while not to_check .empty ():
265265 s1 , s2 = to_check .get ()
266266
267267 # check output equivalence for Dfa / Moore
268- if (isinstance (s1 , DfaState )) and s1 .is_accepting != s2 .is_accepting :
269- return requirements [(s1 , s2 )] if return_cex else False
270- if (isinstance (s1 , MooreState ) and s1 .output != s2 .output ):
268+ if isinstance (s1 , (DfaState , MooreState )) and s1 .output != s2 .output :
271269 return requirements [(s1 , s2 )] if return_cex else False
272270
273271 # check whether the same inputs are enabled + output equivalence for Mealy
274272 t1 , t2 = s1 .transitions , s2 .transitions
275273 for t in it .chain (t1 .keys (), filter (lambda x : x not in t1 .keys (), t2 .keys ())):
276274 common = t in t1 .keys () and t in t2 .keys ()
277275 if (not common ) or (isinstance (s1 , MealyState ) and s1 .output_fun [t ] != s2 .output_fun [t ]) :
278- return requirements [(s1 , s2 )] + [ t ] if return_cex else False
276+ return requirements [(s1 , s2 )] + ( t ,) if return_cex else False
279277
280278 for t in t1 .keys ():
281279 c1 , c2 = t1 [t ], t2 [t ]
282280 if (c1 , c2 ) not in requirements :
283- requirements [(c1 , c2 )] = requirements [(s1 , s2 )] + [ t ]
281+ requirements [(c1 , c2 )] = requirements [(s1 , s2 )] + ( t ,)
284282 to_check .put ((c1 , c2 ))
285283
286284 return None if return_cex else True
0 commit comments