26 #include <opencog/util/Logger.h>
36 using namespace opencog;
52 std::set<Type> connectives({AND_LINK, OR_LINK, NOT_LINK});
116 const std::set<Handle>& opts)
126 for (
const Handle& v : vars)
128 auto it = typemap.find(v);
129 if (it != typemap.end())
138 for (
const Handle& h : compo)
140 bool h_is_opt =
false;
141 for (
const Handle& opt : opts)
159 OC_ASSERT (0 ==
_num_virts,
"Must not have any virtuals!");
190 :
Link(PATTERN_LINK, hseq, tv, av)
211 :
Link(t, hseq, tv, av)
214 if (BIND_LINK == t)
return;
226 throw InvalidParamException(TRACE_INFO,
227 "Expecting a PatternLink, got %s", tname.c_str());
231 if (BIND_LINK == tscope)
return;
247 size_t sz = oset.size();
249 throw InvalidParamException(TRACE_INFO,
250 "Expecting an outgoing set size of at most two, got %d", sz);
285 if (VARIABLE_LIST == t)
352 logger().warn(
"%s: Constant clauses removed from pattern",
365 for (
const Handle& v : vars)
375 throw InvalidParamException(TRACE_INFO,
376 "The variable %s does not appear (unquoted) in any clause!",
377 v->toShortString().c_str());
384 if (0 == vars.size() and 0 == clauses.size())
385 throw InvalidParamException(TRACE_INFO,
386 "No variable appears (unquoted) anywhere in any clause!");
395 const std::vector<Handle> &component)
398 for (
const Handle& h : component)
400 Type t = h->getType();
401 if (ABSENT_LINK == t)
408 if (1 != lopt->getArity())
409 throw InvalidParamException(TRACE_INFO,
410 "NotLink and AbsentLink can have an arity of one only!");
412 const Handle& inv(lopt->getOutgoingAtom(0));
427 static void add_to_map(std::unordered_multimap<Handle, Handle>& map,
430 if (key->
getType() == VARIABLE_NODE) map.insert({key, value});
432 if (NULL == lll)
return;
433 const HandleSeq& oset = lll->getOutgoingSet();
481 void PatternLink::unbundle_virtual(
const std::set<Handle>& vars,
485 std::set<Handle>& black_clauses)
487 for (
const Handle& clause: clauses)
489 bool is_virtual =
false;
490 bool is_black =
false;
492 #ifdef BORKEN_DOESNT_WORK
499 if (VARIABLE_NODE == clause->getType())
507 FindAtoms fgpn(GROUNDED_PREDICATE_NODE,
true);
548 FindAtoms feol(EXECUTION_OUTPUT_LINK,
true);
569 virtual_clauses.push_back(clause);
571 fixed_clauses.push_back(clause);
574 black_clauses.insert(clause);
591 for (
const Handle& term: oset)
593 Type t = term->getType();
594 if (connectives.find(t) == connectives.end())
continue;
627 if (it->second.size() == 1)
641 for (
const Handle& ho: l->getOutgoingSet())
665 parent->addOutgoingTerm(ptm);
670 for (
const Handle& ho: l->getOutgoingSet())
681 if (1 == components.size())
return;
686 std::stringstream ss;
687 ss <<
"Pattern is not connected! Found "
688 << components.size() <<
" components:\n";
690 for (
const auto& comp : components)
692 ss <<
"Connected component " << cnt
693 <<
" consists of ----------------: \n";
694 for (
Handle h : comp) ss << h->toString();
697 throw InvalidParamException(TRACE_INFO, ss.str().c_str());
705 printf(
"\nRedex '%s' has following clauses:\n",
710 printf(
"Mandatory %d:", cl);
712 printf(
" (evaluatable)");
714 printf(
" (executable)");
722 printf(
"Predicate includes the following optional clauses:\n");
726 printf(
"Optional clause %d:", cl);
728 printf(
" (evaluatable)");
730 printf(
" (executable)");
737 printf(
"No optional clauses\n");
743 printf(
"Bound var: ");
prt(h);
747 printf(
"There are no bound vars in this pattern\n");
const HandleSeq & getOutgoingSet() const
void unbundle_virtual(const std::set< Handle > &vars, const HandleSeq &clauses, HandleSeq &concrete_clauses, HandleSeq &virtual_clauses, std::set< Handle > &black_clauses)
std::set< Handle > varset
static bool is_atom_in_tree(const Handle &tree, const Handle &atom)
std::shared_ptr< PatternTerm > PatternTermPtr
std::vector< Handle > HandleSeq
a list of handles
void debug_print(void) const
std::map< Handle, const std::set< Type > > VariableTypeMap
std::set< Handle > evaluatable_holders
std::set< Handle > varset
const HandleSeq & get_vars(void)
void check_connectivity(const std::vector< HandleSeq > &)
PatternLink(Type, const HandleSeq &, TruthValuePtr tv=TruthValue::DEFAULT_TV(), AttentionValuePtr av=AttentionValue::DEFAULT_AV())
std::shared_ptr< TruthValue > TruthValuePtr
std::set< Handle > evaluatable_terms
std::shared_ptr< AttentionValue > AttentionValuePtr
#define createPatternLink
void trace_connectives(const std::set< Type > &, const HandleSeq &clauses)
void validate_clauses(std::set< Handle > &vars, HandleSeq &clauses)
std::set< Handle > holders
static unsigned int num_unquoted_in_tree(const Handle &tree, const std::set< Handle > &atoms)
std::shared_ptr< Link > LinkPtr
void make_term_tree_recursive(const Handle &, const Handle &, PatternTermPtr &)
HandleSeq _component_patterns
ClassServer & classserver(ClassServerFactory *=ClassServer::createInstance)
void setup_components(void)
The second half of the common initialization sequence.
static NodePtr NodeCast(const Handle &h)
std::vector< std::set< Handle > > _component_vars
static void add_to_map(std::unordered_multimap< Handle, Handle > &map, const Handle &key, const Handle &value)
bool remove_constants(const std::set< Handle > &vars, std::vector< Handle > &clauses)
std::set< Handle > least_holders
void get_connected_components(const std::set< Handle > &vars, const HandleSeq &clauses, std::vector< HandleSeq > &components, std::vector< std::set< Handle >> &component_vars)
void unbundle_clauses(const Handle &body)
const std::string & getTypeName(Type type)
std::vector< HandleSeq > _components
std::unordered_multimap< Handle, Handle > in_evaluatable
static LinkPtr LinkCast(const Handle &h)
std::set< Handle > executable_holders
static bool is_unquoted_in_any_tree(const std::vector< Handle > &trees, const Handle &atom)
void make_connectivity_map(const HandleSeq &)
static const PatternTermPtr UNDEFINED
static void prt(const Handle &h)
ConnectMap connectivity_map
const Variables & get_variables(void) const
HandleSeq clauses
The actual clauses. Set by validate_clauses()
void extract_variables(const HandleSeq &oset)
void init_scoped_variables(const Handle &hvar)
unsigned short Type
type of Atoms, represented as short integer (16 bits)
std::set< Handle > executable_terms
void extract_optionals(const std::set< Handle > &vars, const std::vector< Handle > &component)
std::set< Handle > optionals
std::unordered_multimap< Handle, Handle > in_executable
void make_map_recursive(const Handle &, const Handle &)
av init(getOutgoingSet())
void search_set(const Handle &h)
ConnectTermMap connected_terms_map