00001 #include <iostream>
00002 #include <ceta/ceta.hh>
00003
00004 using namespace ceta;
00005 using namespace std;
00006
00007 int main(int argc, char **argv) {
00008
00009 theory_t theory;
00010 kind_t k = *add_kind(theory, kind_t("k"));
00011 op_t a = *add_op(theory, make_constant("a", k));
00012 op_t b = *add_op(theory, make_constant("b", k));
00013 op_t f = *add_op(theory, make_binary_op("f", k, k, k));
00014 set_axioms(theory, f, assoc() | comm());
00015
00016
00017 ta_t ta_base(theory);
00018 state_t qa = *add_state(ta_base, state_t(k, "qa"));
00019 state_t qb = *add_state(ta_base, state_t(k, "qb"));
00020
00021 add_rule(ta_base, make_constant_rule(a, qa));
00022 add_rule(ta_base, make_constant_rule(b, qb));
00023
00024
00025
00026 ta_t ta_eq = ta_base;
00027
00028 state_t qe = *add_state(ta_eq, state_t(k, "qe"));
00029 set_predicate(ta_eq, qe);
00030
00031 add_rule(ta_eq, make_binary_rule(f, qa, qb, qe));
00032 add_rule(ta_eq, make_binary_rule(f, qe, qe, qe));
00033
00034
00035
00036
00037 ta_t ta_gt = ta_eq;
00038 state_t qge = *add_state(ta_gt, state_t(k, "qge"));
00039 set_predicate(ta_gt, qge & !qe);
00040
00041
00042 add_erule(ta_gt, erule_t(qe, qge));
00043 add_rule(ta_gt, make_binary_rule(f, qa, qge, qge));
00044
00045
00046 test_result_t result = test_emptiness(ta_eq & ta_gt);
00047 if (!result)
00048 cerr << "ta_eq & ta_gt expected to be empty." << endl;
00049
00050 result = test_emptiness(!ta_eq & ta_gt);
00051 if (result) {
00052 cerr << "!ta_eq & ta_gt expected to be not empty." << endl;
00053 } else {
00054
00055 cerr << "counterexample: " << counterexample(result)
00056 << " set: " << reachable_set(result)
00057 << endl;
00058 }
00059
00060 }