spot/doc/org/tut22.org
Alexandre Duret-Lutz 892e648970 org: add some help for upgrading old code
* doc/org/upgrade2.org: New file.
* doc/Makefile.am, doc/org/index.org: Add it.
* doc/org/tut22.org: Add some custom id for reference.
* doc/org/spot.css: Style the tables.
* NEWS: Mention the new doc.
2016-03-02 17:44:03 +01:00

3.5 KiB

Creating an automaton by adding states and transitions

This example demonstrates how to create an automaton and then print it.

C++

  #include <iostream>
  #include <spot/twaalgos/hoa.hh>
  #include <spot/twa/twagraph.hh>

  int main(void)
  {
    // The bdd_dict is used to maintain the correspondence between the
    // atomic propositions and the BDD variables that label the edges of
    // the automaton.
    spot::bdd_dict_ptr dict = spot::make_bdd_dict();
    // This creates an empty automaton that we have yet to fill.
    spot::twa_graph_ptr aut = make_twa_graph(dict);

    // Since a BDD is associated to every atomic proposition, the
    // register_ap() function returns a BDD variable number
    // that can be converted into a BDD using bdd_ithvar().
    bdd p1 = bdd_ithvar(aut->register_ap("p1"));
    bdd p2 = bdd_ithvar(aut->register_ap("p2"));

    // Set the acceptance condition of the automaton to Inf(0)&Inf(1)
    aut->set_generalized_buchi(2);

    // States are numbered from 0.
    aut->new_states(3);

    // new_edge() takes 3 mandatory parameters: source state,
    // destination state, and label.  A last optional parameter can be
    // used to specify membership to acceptance sets.
    aut->new_edge(0, 1, p1);
    aut->new_edge(1, 1, p1 & p2, {0});
    aut->new_edge(1, 2, p2, {1});
    aut->new_edge(2, 1, p1 | p2, {0, 1});

    // Print the resulting automaton.
    print_hoa(std::cout, aut);
    return 0;
  }
HOA: v1
States: 3
Start: 0
AP: 2 "p1" "p2"
acc-name: generalized-Buchi 2
Acceptance: 2 Inf(0)&Inf(1)
properties: trans-labels explicit-labels trans-acc
--BODY--
State: 0
[0] 1
State: 1
[0&1] 1 {0}
[1] 2 {1}
State: 2
[0 | 1] 1 {0 1}
--END--

Python

  import spot
  import buddy

  # The bdd_dict is used to maintain the correspondence between the
  # atomic propositions and the BDD variables that label the edges of
  # the automaton.
  bdict = spot.make_bdd_dict();
  # This creates an empty automaton that we have yet to fill.
  aut = spot.make_twa_graph(bdict)

  # Since a BDD is associated to every atomic proposition, the register_ap()
  # function returns a BDD variable number that can be converted into a BDD using
  # bdd_ithvar() from the BuDDy library.
  p1 = buddy.bdd_ithvar(aut.register_ap("p1"))
  p2 = buddy.bdd_ithvar(aut.register_ap("p2"))

  # Set the acceptance condition of the automaton to Inf(0)&Inf(1)
  aut.set_generalized_buchi(2)

  # States are numbered from 0.
  aut.new_states(3)

  # new_edge() takes 3 mandatory parameters: source state, destination state, and
  # label.  A last optional parameter can be used to specify membership to
  # acceptance sets.  In the Python version, the list of acceptance sets the
  # transition belongs to should be specified as a list.
  aut.new_edge(0, 1, p1)
  aut.new_edge(1, 1, p1 & p2, [0])
  aut.new_edge(1, 2, p2, [1]);
  aut.new_edge(2, 1, p1 | p2, [0, 1]);

  # Print the resulting automaton.
  print(aut.to_str('hoa'))
HOA: v1
States: 3
Start: 0
AP: 2 "p1" "p2"
acc-name: generalized-Buchi 2
Acceptance: 2 Inf(0)&Inf(1)
properties: trans-labels explicit-labels trans-acc
--BODY--
State: 0
[0] 1
State: 1
[0&1] 1 {0}
[1] 2 {1}
State: 2
[0 | 1] 1 {0 1}
--END--