|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.