omg_1_buechi.cpp
Go to the documentation of this file.
1/** @file omg_1_buechi.cpp
2
3Tutorial 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
14using namespace faudes;
15
16
17
18int 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
void Write(const Type *pContext=0) const
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.33k --- 2025.09.16 --- c++ api documentaion by doxygen