#ifndef GOOSE_SEMA_UNI_RULESET_H #define GOOSE_SEMA_UNI_RULESET_H //#define UNIRULES_DEBUG namespace goose::sema { class UnificationContext; #ifdef UNIRULES_DEBUG struct UniRuleInfo { const char* pFilename = nullptr; uint32_t line = 0; }; #define URINFOS UniRuleInfo{ __FILE__, __LINE__ } #else struct UniRuleInfo {}; #define URINFOS UniRuleInfo{} #endif class UnificationRuleSet { public: using UniFunc = function< UniGen ( const Term& lhs, const Term& rhs, UnificationContext& ) >; using HalfUniFunc = function< UniGen ( const Term& lhs, UnificationContext& ) >; struct UniRule { UniFunc func; UniRuleInfo infos; }; struct HalfUniRule { HalfUniFunc func; UniRuleInfo infos; }; UnificationRuleSet(); void addSymRule( UniRuleInfo&& infos, const Term& pat, UniFunc f ); void addSymRule( UniRuleInfo&& infos, const Term& pat1, const Term& pat2, UniFunc f ); void addAsymRule( UniRuleInfo&& infos, const Term& pat1, const Term& pat2, UniFunc f ); void addHalfUnificationRule( UniRuleInfo&& infos, const Term& pat, HalfUniFunc f ); const auto& uniRules() const { return m_uniRules; } const auto& halfUniRules() const { return m_halfUniRules; } private: Trie< UniRule > m_uniRules; Trie< HalfUniRule > m_halfUniRules; }; } #endif