Annotation of 43BSD/contrib/B/src/bint/b2tcU.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
                      2: 
                      3: /*
                      4:   $Header: b2tcU.c,v 1.4 85/08/22 16:57:11 timo Exp $
                      5: */
                      6: 
                      7: /* unification of polytypes */
                      8: 
                      9: #include "b.h"
                     10: #include "b1obj.h"
                     11: #include "b2tcP.h"
                     12: #include "b2tcU.h"
                     13: #include "b2tcE.h"
                     14: 
                     15: Hidden bool bad;
                     16: Hidden bool cycling;
                     17: Hidden bool badcycle;
                     18: 
                     19: Visible Procedure unify(a, b, pu)
                     20: polytype a, b, *pu;
                     21: {
                     22:        bad = No;
                     23:        cycling = No;
                     24:        setreprtable();
                     25:        u_unify(a, b, pu);
                     26:        if (bad) badtyperr(a, b);
                     27:        delreprtable();
                     28: }
                     29: 
                     30: Hidden Procedure u_unify(a, b, pu)
                     31: polytype a, b, *pu;
                     32: {
                     33:        typekind a_kind, b_kind;
                     34:        polytype res;
                     35:        
                     36:        a_kind = kind(a);
                     37:        b_kind = kind(b);
                     38:        
                     39:        if (are_same_types(a, b)) {
                     40:                *pu = p_copy(a);
                     41:        }
                     42:        else if (t_is_var(a_kind) || t_is_var(b_kind)) {
                     43:                substitute_for(a, b, pu);
                     44:        }
                     45:        else if (have_same_structure(a, b)) {
                     46:                unify_subtypes(a, b, pu);
                     47:        }
                     48:        else if (has_number(a_kind) && has_number(b_kind)) {
                     49:                *pu = mkt_number();
                     50:        }
                     51:        else if (has_text(a_kind) && has_text(b_kind)) {
                     52:                *pu = mkt_text();
                     53:        }
                     54:        else if (has_text(a_kind) && t_is_tlt(b_kind)) {
                     55:                u_unify(asctype(b), (res = mkt_text()), pu);
                     56:                p_release(res);
                     57:        }
                     58:        else if (has_text(b_kind) && t_is_tlt(a_kind)) {
                     59:                u_unify(asctype(a), (res = mkt_text()), pu);
                     60:                p_release(res);
                     61:        }
                     62:        else if ((t_is_list(a_kind) && has_lt(b_kind))
                     63:                 ||
                     64:                 (t_is_list(b_kind) && has_lt(a_kind))
                     65:        )
                     66:        {
                     67:                u_unify(asctype(a), asctype(b), &res);
                     68:                *pu = mkt_list(res);
                     69:        }
                     70:        else if (t_is_table(a_kind) && has_lt(b_kind)) {
                     71:                u_unify(asctype(a), asctype(b), &res);
                     72:                *pu = mkt_table(p_copy(keytype(a)), res);
                     73:        }
                     74:        else if (t_is_table(b_kind) && has_lt(a_kind)) {
                     75:                u_unify(asctype(a), asctype(b), &res);
                     76:                *pu = mkt_table(p_copy(keytype(b)), res);
                     77:        }
                     78:        else if ((t_is_tlt(a_kind) && t_is_lt(b_kind))
                     79:                 || 
                     80:                 (t_is_lt(a_kind) && t_is_tlt(b_kind)))
                     81:        {
                     82:                u_unify(asctype(a), asctype(b), &res);
                     83:                *pu = mkt_lt(res);
                     84:        }
                     85:        else if (t_is_error(a_kind) || t_is_error(b_kind)) {
                     86:                *pu = mkt_error();
                     87:        }
                     88:        else {
                     89:                *pu = mkt_error();
                     90:                if (cycling)
                     91:                        badcycle = Yes;
                     92:                else
                     93:                        bad = Yes;
                     94:        }
                     95: }
                     96: 
                     97: Hidden Procedure unify_subtypes(a, b, pu)
                     98: polytype a, b, *pu;
                     99: {
                    100:        polytype sa, sb, s;
                    101:        intlet nsub, is;
                    102:        
                    103:        nsub = nsubtypes(a);
                    104:        *pu = mkt_polytype(kind(a), nsub);
                    105:        for (is = 0; is < nsub; is++) {
                    106:                sa = subtype(a, is);
                    107:                sb = subtype(b, is);
                    108:                u_unify(sa, sb, &s);
                    109:                putsubtype(s, *pu, is);
                    110:        }
                    111: }
                    112: 
                    113: Forward bool contains();
                    114: Forward bool equal_vars();
                    115: 
                    116: Hidden Procedure substitute_for(a, b, pu)
                    117: polytype a, b, *pu;
                    118: {
                    119:        typekind a_kind, b_kind;
                    120:        polytype ta, tb;
                    121:        bool ta_is_a, tb_is_b;
                    122:        
                    123:        a_kind = kind(a);
                    124:        b_kind = kind(b);
                    125:        
                    126:        if (t_is_var(a_kind) && table_has_type_of(a)) {
                    127:                ta = type_of(a);
                    128:                ta_is_a = No;
                    129:        }
                    130:        else {
                    131:                ta = a;
                    132:                ta_is_a = Yes;
                    133:        }
                    134:        if (t_is_var(b_kind) && table_has_type_of(b)) {
                    135:                tb = type_of(b);
                    136:                tb_is_b = No;
                    137:        }
                    138:        else {
                    139:                tb = b;
                    140:                tb_is_b = Yes;
                    141:        }
                    142:        
                    143:        if (!(ta_is_a && tb_is_b))
                    144:                u_unify(ta, tb, pu);
                    145:        else if (!t_is_var(a_kind))
                    146:                *pu = p_copy(a);
                    147:        else
                    148:                *pu = p_copy(b);
                    149:        
                    150:        if (t_is_var(a_kind)) {
                    151:                if (contains(*pu, bottom_var(a)))
                    152:                        textify(a, pu);
                    153:        }
                    154:        if (t_is_var(b_kind)) {
                    155:                if (contains(*pu, bottom_var(b)))
                    156:                        textify(b, pu);
                    157:        }
                    158:        
                    159:        if (t_is_var(a_kind) && !are_same_types(*pu, a))
                    160:                repl_type_of(a, *pu);
                    161:        if (t_is_var(b_kind) && !are_same_types(*pu, b))
                    162:                repl_type_of(b, *pu);
                    163: }
                    164: 
                    165: Hidden Procedure textify(a, pu)
                    166: polytype a, *pu;
                    167: {
                    168:        polytype ttext, text_hopefully;
                    169:        
                    170:        ttext = mkt_text();
                    171:        cycling = Yes;
                    172:        badcycle = No;
                    173:        u_unify(*pu, ttext, &text_hopefully);
                    174:        if (badcycle EQ No) {
                    175:                p_release(text_hopefully);
                    176:                u_unify(a, ttext, &text_hopefully);
                    177:        }
                    178:        if (badcycle EQ No) {
                    179:                *pu = ttext;
                    180:        }
                    181:        else {
                    182:                *pu = mkt_error();
                    183:                cyctyperr(a);
                    184:                p_release(ttext);
                    185:        }
                    186:        p_release(text_hopefully);
                    187:        cycling = No;
                    188: }
                    189: 
                    190: Visible bool contains(u, a) polytype u, a; {
                    191:        bool result;
                    192:        
                    193:        result = No;
                    194:        if (t_is_var(kind(u))) {
                    195:                if (table_has_type_of(u)) {
                    196:                        result = contains(type_of(u), a);
                    197:                }
                    198:        }
                    199:        else {
                    200:                polytype s;
                    201:                intlet is, nsub;
                    202:                nsub = nsubtypes(u);
                    203:                for (is = 0; is < nsub; is++) {
                    204:                        s = subtype(u, is);
                    205:                        if (equal_vars(s, a) || contains(s, a)) {
                    206:                                result = Yes;
                    207:                                break;
                    208:                        }
                    209:                }
                    210:        }
                    211:        return (result);
                    212: }
                    213: 
                    214: Visible bool equal_vars(s, a) polytype s, a; {
                    215:        return (are_same_types(bottom_var(s), a));
                    216: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.