2
2
#include < cstring>
3
3
#include < functional>
4
4
#include < iostream>
5
- #include < map>
6
- #include < set>
7
5
8
6
#include < ds/ds.hh>
7
+ #include < ds/search.hh>
9
8
#include < ds/utility.hh>
10
9
11
- struct PointerLess {
12
- template <typename T>
13
- bool operator ()(const T& lhs, const T& rhs) const {
14
- if (lhs->data_size () < rhs->data_size ()) {
15
- return true ;
16
- }
17
- if (lhs->data_size () > rhs->data_size ()) {
18
- return false ;
19
- }
20
- ds::length_t data_size = lhs->data_size ();
21
- const std::byte* lhs_data = reinterpret_cast <const std::byte*>(lhs.get ());
22
- const std::byte* rhs_data = reinterpret_cast <const std::byte*>(rhs.get ());
23
- for (ds::length_t index = 0 ; index < data_size; ++index) {
24
- if (lhs_data[index] < rhs_data[index]) {
25
- return true ;
26
- }
27
- if (lhs_data[index] > rhs_data[index]) {
28
- return false ;
29
- }
30
- }
31
- return false ;
32
- }
33
- };
34
-
35
10
void run () {
36
11
int temp_data_size = 1000 ;
37
12
int temp_text_size = 1000 ;
38
13
int single_result_size = 10000 ;
39
14
15
+ auto search = ds::search_t (temp_data_size, single_result_size);
16
+
40
17
// P -> Q, P |- Q
41
- auto mp = ds::text_to_rule (
42
- " (`P -> `Q)\n "
43
- " `P\n "
44
- " ----------\n "
45
- " `Q" ,
46
- temp_data_size
47
- );
18
+ search.add (" (`P -> `Q) `P `Q" );
48
19
// p -> (q -> p)
49
- auto axiom1 = ds::text_to_rule (
50
- " ------------------\n "
51
- " (`p -> (`q -> `p))\n " ,
52
- temp_data_size
53
- );
20
+ search.add (" (`p -> (`q -> `p))" );
54
21
// (p -> (q -> r)) -> ((p -> q) -> (p -> r))
55
- auto axiom2 = ds::text_to_rule (
56
- " --------------------------------------------------\n "
57
- " ((`p -> (`q -> `r)) -> ((`p -> `q) -> (`p -> `r)))\n " ,
58
- temp_data_size
59
- );
22
+ search.add (" ((`p -> (`q -> `r)) -> ((`p -> `q) -> (`p -> `r)))" );
60
23
// (!p -> !q) -> (q -> p)
61
- auto axiom3 = ds::text_to_rule (
62
- " ----------------------------------\n "
63
- " (((! `p) -> (! `q)) -> (`q -> `p))\n " ,
64
- temp_data_size
65
- );
24
+ search.add (" (((! `p) -> (! `q)) -> (`q -> `p))" );
66
25
67
- auto premise = ds::text_to_rule ( " (! (! X)) " , temp_data_size);
68
- auto target = ds::text_to_rule ( " X " , temp_data_size );
26
+ // premise
27
+ search. add ( " (! (! X)) " );
69
28
70
- std::map<std::unique_ptr<ds::rule_t >, ds::length_t , PointerLess> rules;
71
- std::map<std::unique_ptr<ds::rule_t >, ds::length_t , PointerLess> facts;
72
-
73
- std::set<std::unique_ptr<ds::rule_t >, PointerLess> temp_rules;
74
- std::set<std::unique_ptr<ds::rule_t >, PointerLess> temp_facts;
75
-
76
- ds::length_t cycle = -1 ;
77
- rules.emplace (std::move (mp), cycle);
78
- facts.emplace (std::move (axiom1), cycle);
79
- facts.emplace (std::move (axiom2), cycle);
80
- facts.emplace (std::move (axiom3), cycle);
81
- facts.emplace (std::move (premise), cycle);
82
-
83
- auto buffer = std::unique_ptr<ds::rule_t >(reinterpret_cast <ds::rule_t *>(operator new (single_result_size)));
84
-
85
- auto less = PointerLess ();
29
+ auto target = ds::text_to_rule (" X" , temp_data_size);
86
30
87
31
while (true ) {
88
- temp_rules.clear ();
89
- temp_facts.clear ();
32
+ bool success = false ;
90
33
91
- for (auto & [rule, rules_cycle] : rules) {
92
- for (auto & [fact, facts_cycle] : facts) {
93
- if (rules_cycle != cycle && facts_cycle != cycle) {
94
- continue ;
95
- }
96
- buffer->match (rule.get (), fact.get (), reinterpret_cast <std::byte*>(buffer.get ()) + single_result_size);
97
- if (!buffer->valid ()) {
98
- continue ;
99
- }
100
- if (buffer->premises_count () != 0 ) {
101
- // rule
102
- if (rules.find (buffer) != rules.end () || temp_rules.find (buffer) != temp_rules.end ()) {
103
- continue ;
104
- }
105
- auto new_rule = std::unique_ptr<ds::rule_t >(reinterpret_cast <ds::rule_t *>(operator new (buffer->data_size ())));
106
- memcpy (new_rule.get (), buffer.get (), buffer->data_size ());
107
- temp_rules.emplace (std::move (new_rule));
108
- } else {
109
- // fact
110
- if (facts.find (buffer) != facts.end () || temp_facts.find (buffer) != temp_facts.end ()) {
111
- continue ;
112
- }
113
- auto new_fact = std::unique_ptr<ds::rule_t >(reinterpret_cast <ds::rule_t *>(operator new (buffer->data_size ())));
114
- memcpy (new_fact.get (), buffer.get (), buffer->data_size ());
115
- if ((!less (new_fact, target)) && (!less (target, new_fact))) {
116
- printf (" Found!\n " );
117
- printf (" %s" , ds::rule_to_text (new_fact.get (), temp_text_size).get ());
118
- return ;
119
- }
120
- temp_facts.emplace (std::move (new_fact));
121
- }
34
+ auto callback = [&target, &success, &temp_text_size](ds::rule_t * candidate) {
35
+ if (candidate->data_size () != target->data_size ()) {
36
+ return false ;
122
37
}
123
- }
38
+ auto data_size = candidate->data_size ();
39
+ auto equal = memcmp (candidate->head (), target->head (), data_size) == 0 ;
40
+ if (equal) {
41
+ printf (" Found!\n " );
42
+ printf (" %s" , ds::rule_to_text (candidate, temp_text_size).get ());
43
+ success = true ;
44
+ return true ;
45
+ }
46
+ return false ;
47
+ };
124
48
125
- ++cycle;
126
- for (auto & rule : temp_rules) {
127
- auto & movable_rule = const_cast <std::unique_ptr<ds::rule_t >&>(rule);
128
- rules.emplace (std::move (movable_rule), cycle);
129
- }
130
- for (auto & fact : temp_facts) {
131
- auto & movable_fact = const_cast <std::unique_ptr<ds::rule_t >&>(fact);
132
- facts.emplace (std::move (movable_fact), cycle);
49
+ search.execute (callback);
50
+ if (success) {
51
+ break ;
133
52
}
134
53
}
135
54
}
@@ -139,7 +58,7 @@ void timer(std::function<void()> func) {
139
58
func ();
140
59
auto end = std::chrono::high_resolution_clock::now ();
141
60
std::chrono::duration<double > duration = end - start;
142
- std::cout << " Execution time: " << duration.count () << " seconds\n " << std::flush ;
61
+ std::cout << " Execution time: " << duration.count () << " seconds" << std::endl ;
143
62
}
144
63
145
64
int main () {
0 commit comments