<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 automaton.is_isomorphic(aut)
Whether this automaton isomorphic to aut, i.e., whether they are "the same graph."
Preconditions
Step1:  The automata must be accessible, but coaccessibility is not required.
Step2:  Equivalent automata can be non isomorphic.
Step3:  Weighted Automata
We now build automaton weighted in $\mathbb{Q}$.
<ASSISTANT_TASK:>
Python Code:
import vcsn
def aut(e):
    return vcsn.context('lal_char, b').expression(e, 'binary').standard()
a1 = aut('a*+b*'); a1
a2 = aut('b*+a*'); a2
a1.is_isomorphic(a2), a1 == a2
Explanation: automaton.is_isomorphic(aut)
Whether this automaton isomorphic to aut, i.e., whether they are "the same graph."
Preconditions:
- Both automata are accessible
See also:
- automaton.is_equivalent
Examples
Boolean Automata
Automata are isomorphic if there is a bijection between their states.
The following function takes a (Boolean) rational expression, and return its standard automaton.
End of explanation
%%automaton -s a1
$ -> 0
0 -> 1 a
%%automaton -s a2
$ -> 0
0 -> 1 b
a1.is_isomorphic(a1), a1.is_isomorphic(a2)
Explanation: The automata must be accessible, but coaccessibility is not required.
End of explanation
a1 = aut('a+a')
a2 = aut('a')
a1.is_isomorphic(a2), a1.is_equivalent(a2)
Explanation: Equivalent automata can be non isomorphic.
End of explanation
def aut(e):
    return vcsn.context('lal_char, z').expression(e, 'binary').standard()
a1 = aut('<2>a+<3>b')
a2 = aut('<3>b+<2>a')
a1.is_isomorphic(a2)
a1 = aut('<2>a')
a2 = aut('a+a')
a1.is_isomorphic(a2)
Explanation: Weighted Automata
We now build automaton weighted in $\mathbb{Q}$.
End of explanation
<END_TASK>