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: }