File: program.cc

package info (click to toggle)
gringo 5.8.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 32,128 kB
  • sloc: cpp: 210,867; ansic: 37,507; python: 11,271; yacc: 825; javascript: 627; sh: 368; xml: 364; makefile: 102
file content (126 lines) | stat: -rw-r--r-- 4,666 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <catch2/catch_test_macros.hpp>
#include <potassco/aspif_text.h>
#include <reify/program.hh>

#include <sstream>

namespace Reify {
namespace Test {

bool read(std::stringstream &in, std::stringstream &out, bool scc = false, bool step = false) {
    Reifier prg(out, scc, step);
    Potassco::AspifTextInput parser(&prg);
    return Potassco::readProgram(in, parser, 0) == 0;
}

TEST_CASE("program", "[program]") {
    std::stringstream input, output;

    SECTION("empty") {
        REQUIRE(read(input, output));
        REQUIRE(output.str() == "");
    }
    SECTION("incremental") {
        input << "#incremental.";
        REQUIRE(read(input, output));
        REQUIRE(output.str() == "tag(incremental).\n");
    }
    SECTION("normal") {
        input << "a:-b.";
        REQUIRE(read(input, output));
        REQUIRE(output.str() == "atom_tuple(0).\natom_tuple(0,1).\nliteral_tuple(0).\nliteral_tuple(0,2).\nrule("
                                "disjunction(0),normal(0)).\n");
    }
    SECTION("step") {
        input << "#incremental.";
        input << "a:-b.";
        input << "#step.";
        input << "c:-b.";
        auto result = "tag(incremental).\n"
                      "atom_tuple(0,0).\n"
                      "atom_tuple(0,1,0).\n"
                      "literal_tuple(0,0).\n"
                      "literal_tuple(0,2,0).\n"
                      "rule(disjunction(0),normal(0),0).\n"
                      "atom_tuple(0,1).\n"
                      "atom_tuple(0,3,1).\n"
                      "literal_tuple(0,1).\n"
                      "literal_tuple(0,2,1).\n"
                      "rule(disjunction(0),normal(0),1).\n";
        REQUIRE(read(input, output, false, true));
        REQUIRE(output.str() == result);
    }
    SECTION("cycle") {
        input << "a:-b."
              << "b:-a.";
        auto result = "atom_tuple(0).\n"
                      "atom_tuple(0,1).\n"
                      "literal_tuple(0).\n"
                      "literal_tuple(0,2).\n"
                      "rule(disjunction(0),normal(0)).\n"
                      "atom_tuple(1).\n"
                      "atom_tuple(1,2).\n"
                      "literal_tuple(1).\n"
                      "literal_tuple(1,1).\n"
                      "rule(disjunction(1),normal(1)).\n"
                      "scc(0,1).\n"
                      "scc(0,2).\n";
        REQUIRE(read(input, output, true));
        REQUIRE(output.str() == result);
    }
    SECTION("choice") {
        input << "{a, b}.";
        REQUIRE(read(input, output));
        REQUIRE(output.str() ==
                "atom_tuple(0).\natom_tuple(0,1).\natom_tuple(0,2).\nliteral_tuple(0).\nrule(choice(0),normal(0)).\n");
    }
    SECTION("sum") {
        input << ":-1 {a, b}.";
        REQUIRE(read(input, output));
        REQUIRE(output.str() == "atom_tuple(0).\nweighted_literal_tuple(0).\nweighted_literal_tuple(0,1,1).\nweighted_"
                                "literal_tuple(0,2,1).\nrule(disjunction(0),sum(0,1)).\n");
    }
    SECTION("minimize") {
        input << "#minimize {a=10, b=20}.";
        REQUIRE(read(input, output));
        REQUIRE(output.str() == "weighted_literal_tuple(0).\nweighted_literal_tuple(0,1,10).\nweighted_literal_tuple(0,"
                                "2,20).\nminimize(0,0).\n");
    }
    SECTION("project") {
        input << "#project {a}.";
        REQUIRE(read(input, output));
        REQUIRE(output.str() == "project(1).\n");
    }
    SECTION("output") {
        input << "#output a:b,c.";
        REQUIRE(read(input, output));
        REQUIRE(output.str() == "literal_tuple(0).\nliteral_tuple(0,2).\nliteral_tuple(0,3).\noutput(a,0).\n");
    }
    SECTION("external") {
        input << "#external a.";
        REQUIRE(read(input, output));
        REQUIRE(output.str() == "external(1,false).\n");
    }
    SECTION("assume") {
        input << "#assume {a}.";
        REQUIRE(read(input, output));
        REQUIRE(output.str() == "assume(1).\n");
    }
    SECTION("heuristic") {
        input << "#heuristic a. [1, level]";
        input << "#heuristic b : c. [2@1, true]";
        REQUIRE(read(input, output));
        REQUIRE(output.str() == "literal_tuple(0).\nheuristic(1,level,1,0,0).\nliteral_tuple(1).\nliteral_tuple(1,3)."
                                "\nheuristic(2,true,2,1,1).\n");
    }
    SECTION("edge") {
        input << "#edge (1,2) : a.";
        input << "#edge (2,1).";
        REQUIRE(read(input, output));
        REQUIRE(output.str() ==
                "literal_tuple(0).\nliteral_tuple(0,1).\nedge(1,2,0).\nliteral_tuple(1).\nedge(2,1,1).\n");
    }
}

} // namespace Test
} // namespace Reify