24 #include <opencog/util/Logger.h>
36 using namespace opencog;
41 #define dbgprt(f, varargs...) printf(f, ##varargs)
43 #define dbgprt(f, varargs...)
60 return _cb.node_match(node1, node2);
63 return _cb.variable_match(node1, node2);
66 return _cb.link_match(link1, link2);
69 return _cb.post_link_match(link1, link2);
72 return _cb.fuzzy_match(h1, h2);
75 const std::map<Handle, Handle> &gnds) {
76 throw InvalidParamException(TRACE_INFO,
77 "Not expecting a virtual link here!");
80 return _cb.clause_match(pattrn_link_h, grnd_link_h);
83 return _cb.optional_clause_match(pattrn, grnd);
86 return _cb.get_incoming_set(h);
88 void push(
void) { _cb.push(); }
89 void pop(
void) { _cb.pop(); }
93 _cb.set_pattern(vars, pat);
98 return _cb.initiate_search(pme);
103 bool grounding(
const std::map<Handle, Handle> &var_soln,
104 const std::map<Handle, Handle> &term_soln)
106 _term_groundings.push_back(term_soln);
107 _var_groundings.push_back(var_soln);
132 const std::vector<Handle>& virtuals,
133 const std::vector<Handle>& negations,
134 const std::map<Handle, Handle>& var_gnds,
135 const std::map<Handle, Handle>& term_gnds,
137 std::vector<std::vector<std::map<Handle, Handle>>> comp_var_gnds,
138 std::vector<std::vector<std::map<Handle, Handle>>> comp_term_gnds)
144 if (0 == comp_var_gnds.size())
147 dbgprt(
"\nExplore one possible combinatoric grounding "
148 "(var_gnds.size = %zu, term_gnds.size = %zu):\n",
149 var_gnds.size(), term_gnds.size());
157 for (
const Handle& virt : virtuals)
182 if (not match)
return false;
187 return cb.
grounding(var_gnds, term_gnds);
189 dbgprt(
"Component recursion: num comp=%zd\n", comp_var_gnds.size());
200 std::vector<std::map<Handle, Handle>> vg = comp_var_gnds.back();
201 comp_var_gnds.pop_back();
202 std::vector<std::map<Handle, Handle>> pg = comp_term_gnds.back();
203 comp_term_gnds.pop_back();
205 size_t ngnds = vg.size();
206 for (
size_t i=0; i<ngnds; i++)
211 std::map<Handle, Handle> rvg(var_gnds);
212 std::map<Handle, Handle> rpg(term_gnds);
214 const std::map<Handle, Handle>& cand_vg(vg[i]);
215 const std::map<Handle, Handle>& cand_pg(pg[i]);
216 rvg.insert(cand_vg.begin(), cand_vg.end());
217 rpg.insert(cand_pg.begin(), cand_pg.end());
220 comp_var_gnds, comp_term_gnds);
223 if (accept)
return true;
318 throw InvalidParamException(TRACE_INFO,
319 "BindLink consists of multiple disconnected components!");
343 printf(
"==================== Done with Search ==================\n");
361 printf(
"VIRTUAL PATTERN: ====================== "
363 printf(
"Virtuals are:\n");
367 printf(
"Virtual clause %zu of %zu:\n%s\n", iii,
_num_virts,
368 v->toShortString().c_str());
373 std::vector<std::vector<std::map<Handle, Handle>>> comp_term_gnds;
374 std::vector<std::vector<std::map<Handle, Handle>>> comp_var_gnds;
378 dbgprt(
"BEGIN COMPONENT GROUNDING %zu of %zu: ======================\n",
390 dbgprt(
"BEGIN component recursion: ====================== "
391 "num comp=%zd num virts=%zd\n",
392 comp_var_gnds.size(), _virtual.size());
393 std::map<Handle, Handle> empty_vg;
394 std::map<Handle, Handle> empty_pg;
395 std::vector<Handle> optionals;
398 comp_var_gnds, comp_term_gnds);
virtual bool evaluate_sentence(const Handle &eval, const std::map< Handle, Handle > &gnds)=0
void set_pattern(const Variables &vars, const Pattern &pat)
bool evaluate_sentence(const Handle &link_h, const std::map< Handle, Handle > &gnds)
PatternMatchCallback & _cb
bool link_match(const LinkPtr &link1, const LinkPtr &link2)
bool grounding(const std::map< Handle, Handle > &var_soln, const std::map< Handle, Handle > &term_soln)
bool variable_match(const Handle &node1, const Handle &node2)
virtual bool initiate_search(PatternMatchEngine *)=0
std::vector< std::map< Handle, Handle > > _var_groundings
bool clause_match(const Handle &pattrn_link_h, const Handle &grnd_link_h)
void debug_print(void) const
static void print_solution(const std::map< Handle, Handle > &vars, const std::map< Handle, Handle > &clauses)
std::vector< std::map< Handle, Handle > > _term_groundings
PMCGroundings(PatternMatchCallback &cb)
virtual void set_pattern(const Variables &vars, const Pattern &pat)=0
bool node_match(const Handle &node1, const Handle &node2)
bool fuzzy_match(const Handle &h1, const Handle &h2)
std::shared_ptr< Link > LinkPtr
HandleSeq _component_patterns
static bool recursive_virtual(PatternMatchCallback &cb, const std::vector< Handle > &virtuals, const std::vector< Handle > &negations, const std::map< Handle, Handle > &var_gnds, const std::map< Handle, Handle > &term_gnds, std::vector< std::vector< std::map< Handle, Handle >>> comp_var_gnds, std::vector< std::vector< std::map< Handle, Handle >>> comp_term_gnds)
bool satisfy(PatternMatchCallback &) const
bool post_link_match(const LinkPtr &link1, const LinkPtr &link2)
std::vector< HandleSeq > _components
static PatternLinkPtr PatternLinkCast(const Handle &h)
std::vector< LinkPtr > IncomingSet
bool imply(PatternMatchCallback &, bool check_connectivity=true)
#define dbgprt(f, varargs...)
virtual bool grounding(const std::map< Handle, Handle > &var_soln, const std::map< Handle, Handle > &term_soln)=0
IncomingSet get_incoming_set(const Handle &h)
std::shared_ptr< PatternLink > PatternLinkPtr
bool initiate_search(PatternMatchEngine *pme)
bool optional_clause_match(const Handle &pattrn, const Handle &grnd)