#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