Goose  Diff

Differences From Artifact [52127463c4]:

  • File bs/sema/uni-ruleset.h — part of check-in [f764dd2384] at 2018-12-17 14:39:33 on branch trunk — Refactored unify as a generator that can yield multiple solutions, along with a score to order them. (user: achavasse size: 568)

To Artifact [f25c0d3165]:

  • File bs/sema/uni-ruleset.h — part of check-in [edbc0edea1] at 2018-12-25 21:04:40 on branch trunk — Unification: implement "half-unification" sub algorithm which enumerates all possible solutions contained in an expression, counts their respective scores, and add dependency for any contained hole. (user: achavasse size: 867)

1
2
3
4
5
6
7
8
9
10
11


12
13
14
15
16


17



18


19
20
21


22
23
24
25
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15


16
17
18
19
20
21

22
23
24
25

26
27
28
29
30
31










-
+
+



-
-
+
+

+
+
+
-
+
+


-
+
+




#ifndef EMPATHY_SEMA_UNI_RULESET_H
#define EMPATHY_SEMA_UNI_RULESET_H

namespace empathy::sema
{
    class UnificationContext;

    class UnificationRuleSet
    {
        public:
            using Func = function< UniGen ( const Term& lhs, const Term& rhs, UnificationContext& ) >;
            using UniFunc = function< UniGen ( const Term& lhs, const Term& rhs, UnificationContext& ) >;
            using HalfUniFunc = function< UniGen ( const Term& lhs, UnificationContext& ) >;

            UnificationRuleSet();

            void addRule( const Term& pat, Func f );
            void addRule( const Term& pat1, const Term& pat2, Func f );
            void addRule( const Term& pat, UniFunc f );
            void addRule( const Term& pat1, const Term& pat2, UniFunc f );


            void addRule( const Term& pat, HalfUniFunc f );

            const auto& trie() const { return m_trie; }
            const auto& UniRules() const { return m_uniRules; }
            const auto& HalfUniRules() const { return m_halfUniRules; }

        private:
            Trie< Func > m_trie;
            Trie< UniFunc > m_uniRules;
            Trie< HalfUniFunc > m_halfUniRules;
    };
}

#endif