omg_1_buechi.cpp
Go to the documentation of this file.
1 /** @file omg_1_buechi.cpp
2 
3 Tutorial on basic operations on Buechi automata
4 
5 @ingroup Tutorials
6 
7 @include omg_1_buechi.cpp
8 
9 */
10 
11 #include "libfaudes.h"
12 
13 
14 using namespace faudes;
15 
16 
17 
18 int main() {
19 
20  ///////////////////////////////////
21  // Buechi Trim
22  ///////////////////////////////////
23 
24  // read example generator for reachability analysis
25  Generator greach("data/omg_nottrim.gen");
26 
27  std::cout << "################################\n";
28  std::cout << "# tutorial, buechi trim \n";
29 
30  bool isotrim = IsBuechiTrim(greach);
31  if(isotrim)
32  std::cout << "w-trimness: ok [error]\n";
33  else
34  std::cout << "w-trimness: failed [expected]\n";
35  std::cout << "################################\n";
36 
37  // trim generator
38  Generator gbtrim;
39  BuechiTrim(greach,gbtrim);
40 
41  // write operand and results for html docu
42  greach.Write("tmp_omg_notbtrim.gen");
43  gbtrim.Write("tmp_omg_gobtrim.gen");
44 
45  // record test case
46  FAUDES_TEST_DUMP("buechi trim",isotrim);
47 
48 
49  ////////////////////////////
50  // synchronous composition
51  ////////////////////////////
52 
53  // read generators
54  Generator bparallel_g1("data/omg_bparallel_g1.gen");
55  Generator bparallel_g2("data/omg_bparallel_g2.gen");
56 
57  // perform composition w.r.t buechi acceptance
58  Generator bparallel_g1g2;
59  BuechiParallel(bparallel_g1, bparallel_g2, bparallel_g1g2);
60 
61  // write result and operands for html docu
62  bparallel_g1.Write("tmp_omg_bparallel_g1.gen");
63  bparallel_g2.Write("tmp_omg_bparallel_g2.gen");
64  bparallel_g1g2.Write("tmp_omg_bparallel_g1g2.gen");
65 
66  // Test protocol
67  FAUDES_TEST_DUMP("bparallel",bparallel_g1g2);
68  FAUDES_TEST_DUMP("buechi parallel",bparallel_g1g2);
69 
70 
71  ////////////////////////////
72  // language inclusion
73  ////////////////////////////
74 
75  std::cout << "################################\n";
76  std::cout << "# tutorial, language inclusion\n";
77 
78  // recycle example ffrom parallel
79  Generator bparallel_g1full=bparallel_g1;
80  InvProject(bparallel_g1full,bparallel_g1g2.Alphabet());
81 
82  // do test and report
83  bool langinc_a=BuechiLanguageInclusion(bparallel_g1g2,bparallel_g1full);
84  bool langinc_b=BuechiLanguageInclusion(bparallel_g1full,bparallel_g1g2);
85  bool langinc_c=BuechiLanguageEquality(bparallel_g1full,bparallel_g1g2);
86  if(langinc_a)
87  std::cout << "# g1g2 subseteq g1full (expecte)\n";
88  else
89  std::cout << "# g1g2 not subseteq g1full (test case failed!)\n";
90  if(langinc_b)
91  std::cout << "# g1full subseteq g1g2 (test case failed!))\n";
92  else
93  std::cout << "# g1full not subseteq g1g2 (expected)\n";
94  if(langinc_c)
95  std::cout << "# g1full == g1g2 (test case failed!))\n";
96  else
97  std::cout << "# g1full not == g1g2 (expected)\n";
98 
99  // record
100  FAUDES_TEST_DUMP("language inc a", langinc_a);
101  FAUDES_TEST_DUMP("language inc b", langinc_b);
102  FAUDES_TEST_DUMP("language inc c", langinc_c);
103 
104 
105  ////////////////////////////
106  // closure w.r.t. Buechi acceptance
107  ////////////////////////////
108 
109 
110  // Read generator and write for html docu
111  Generator closure_g("data/omg_bclosure_g.gen");
112  closure_g.Write("tmp_omg_bclosure_g.gen");
113 
114  // test buechi closure
115  bool isclosed_g = IsBuechiClosed(closure_g);
116 
117  // compute buechi closure
118  BuechiClosure(closure_g);
119  closure_g.Write("tmp_omg_bclosure_gRes.gen");
120 
121  // test buechi closure
122  bool isclosed_gRes = IsBuechiClosed(closure_g);
123 
124  // inspect on console
125  std::cout << "################################\n";
126  std::cout << "# buechi closure \n";
127  if(isclosed_g)
128  std::cout << "# argument was buechi closed (test case error!)\n";
129  else
130  std::cout << "# argument was not buechi closed (expected)\n";
131  if(isclosed_gRes)
132  std::cout << "# result is buechi closed (expected)\n";
133  else
134  std::cout << "# result is not buechi closed (test case error!)\n";
135  closure_g.DWrite();
136  std::cout << "################################\n";
137 
138  // Record test case
139  FAUDES_TEST_DUMP("buechi closure", closure_g);
140 
141 
142 
143 
144 }
#define FAUDES_TEST_DUMP(mes, dat)
Definition: cfl_utils.h:505
void DWrite(const Type *pContext=0) const
Definition: cfl_types.cpp:231
void Write(const Type *pContext=0) const
Definition: cfl_types.cpp:145
const EventSet & Alphabet(void) const
void InvProject(Generator &rGen, const EventSet &rProjectAlphabet)
void BuechiParallel(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
bool BuechiTrim(vGenerator &rGen)
void BuechiClosure(Generator &rGen)
bool IsBuechiClosed(const Generator &rGen)
bool BuechiLanguageInclusion(const Generator &rGen1, const Generator &rGen2)
bool BuechiLanguageEquality(const Generator &rGen1, const Generator &rGen2)
bool IsBuechiTrim(const vGenerator &rGen)
int main()

libFAUDES 2.33l --- 2025.09.16 --- c++ api documentaion by doxygen