22#include < cstring>
33#include < functional>
44#include < iostream>
5- #include < map>
6- #include < set>
75
86#include < ds/ds.hh>
7+ #include < ds/search.hh>
98#include < ds/utility.hh>
109
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-
3510void run () {
3611 int temp_data_size = 1000 ;
3712 int temp_text_size = 1000 ;
3813 int single_result_size = 10000 ;
3914
15+ auto search = ds::search_t (temp_data_size, single_result_size);
16+
4017 // 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" );
4819 // 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))" );
5421 // (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)))" );
6023 // (!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))" );
6625
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)) " );
6928
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);
8630
8731 while (true ) {
88- temp_rules.clear ();
89- temp_facts.clear ();
32+ bool success = false ;
9033
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 ;
12237 }
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+ };
12448
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 ;
13352 }
13453 }
13554}
@@ -139,7 +58,7 @@ void timer(std::function<void()> func) {
13958 func ();
14059 auto end = std::chrono::high_resolution_clock::now ();
14160 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 ;
14362}
14463
14564int main () {
0 commit comments