@@ -4606,6 +4606,7 @@
4606 [%atom aura=@ta]
4606 [%atom aura=@ta]
4607 [%any-atom ~]
4607 [%any-atom ~]
4608 [%flag ~]
4608 [%flag ~]
4609+ [%face name=term body=itype]
4609 [%fn sample=itype product=itype]
4610 [%fn sample=itype product=itype]
4610 [%cell hed=itype tal=itype]
4611 [%cell hed=itype tal=itype]
@@ -4648,6 +4649,7 @@
4649 %any-atom |
4650 %any-atom |
4651 %fn |($(t sample.t) $(t product.t))
4653 %fn |($(t sample.t) $(t product.t))
4652 %cell |($(t hed.t) $(t tal.t))
4654 %cell |($(t hed.t) $(t tal.t))
@@ -4687,6 +4689,9 @@
4687 ?. |(?=(%atom -.a) ?=(%any-atom -.a) ?=(%flag -.a)) ~
4689 ?. |(?=(%atom -.a) ?=(%any-atom -.a) ?=(%flag -.a)) ~
4688 `[[id.b a] sub]
4690 `[[id.b a] sub]
4689 ?: &(?=(%atom -.a) ?=(%atom -.b)) ~
4691 ?: &(?=(%atom -.a) ?=(%atom -.b)) ~
4692+ ?: &(?=(%face -.a) ?=(%face -.b))
4693+ ?. =(name.a name.b) ~
4694+ $(a body.a, b body.b)
4690 ?: &(?=(%fn -.a) ?=(%fn -.b))
4695 ?: &(?=(%fn -.a) ?=(%fn -.b))
4691 =/ first=(unit isub) $(a sample.a, b sample.b)
4696 =/ first=(unit isub) $(a sample.a, b sample.b)
4692 ?~ first ~
4697 ?~ first ~
@@ -4714,6 +4719,7 @@
4715 %any-atom &
4720 %any-atom &
4717 %fn |($(t sample.t) $(t product.t))
4723 %fn |($(t sample.t) $(t product.t))
4718 %cell |($(t hed.t) $(t tal.t))
4724 %cell |($(t hed.t) $(t tal.t))
@@ -4744,6 +4750,9 @@
4744 ?: &(?=(%atom -.a) ?=(%atom -.b))
4750 ?: &(?=(%atom -.a) ?=(%atom -.b))
4745 ?. !=(aura.a aura.b) |
4751 ?. !=(aura.a aura.b) |
4746 |((aura-prefix aura.a aura.b) (aura-prefix aura.b aura.a))
4752 |((aura-prefix aura.a aura.b) (aura-prefix aura.b aura.a))
4753+ ?: &(?=(%face -.a) ?=(%face -.b))
4754+ ?. =(name.a name.b) |
4755+ $(a body.a, b body.b)
4747 ?: &(?=(%cell -.a) ?=(%cell -.b))
4756 ?: &(?=(%cell -.a) ?=(%cell -.b))
4748 |($(a hed.a, b hed.b) $(a tal.a, b tal.b))
4757 |($(a hed.a, b hed.b) $(a tal.a, b tal.b))
4749 ?: &(?=(%fn -.a) ?=(%fn -.b))
4758 ?: &(?=(%fn -.a) ?=(%fn -.b))
@@ -4764,6 +4773,7 @@
4765 %any-atom &
4774 %any-atom &
4776+ %face $(typ body.typ)
4767 %fn |($(typ sample.typ) $(typ product.typ))
4777 %fn |($(typ sample.typ) $(typ product.typ))
4768 %cell |($(typ hed.typ) $(typ tal.typ))
4778 %cell |($(typ hed.typ) $(typ tal.typ))
@@ -4781,6 +4791,63 @@
4781 ?: &(?=(%any-atom -.b) |(?=(%atom -.a) ?=(%flag -.a))) `b
4791 ?: &(?=(%any-atom -.b) |(?=(%atom -.a) ?=(%flag -.a))) `b
4794+:: Unifying an already-bound tuple with a faced position would need to
4795+:: update the bound type. Until substitutions can retain that information,
4796+:: variable-dependent face merges stay unresolved.
4799+ |= [t=itype sub=isub]
4801+ =. t (itype-walk t sub)
4804+ %cell |($(t hed.t) $(t tal.t))
4805+ %fn |($(t sample.t) $(t product.t))
4810+ |= [a=itype b=itype sub=isub]
4812+ =. a (itype-walk a sub)
4813+ =. b (itype-walk b sub)
4814+ ?: &(?=(%face -.a) ?=(%face -.b)) $(a body.a, b body.b)
4815+ ?: ?=(%face -.a) !|(?=(%var -.b) ?=(%avar -.b) ?=(%nvar -.b))
4816+ ?: ?=(%face -.b) !|(?=(%var -.a) ?=(%avar -.a) ?=(%nvar -.a))
4817+ ?: &(?=(%cell -.a) ?=(%cell -.b)) |($(a hed.a, b hed.b) $(a tal.a, b tal.b))
4818+ ?: &(?=(%fn -.a) ?=(%fn -.b)) |($(a sample.a, b sample.b) $(a product.a, b product.b))
4821+:: A successful cast keeps any explicit faces from either side while
4822+:: retaining the target's aura choices. Both faces have already matched.
4824+++ itype-merge-faces
4825+ |= [actual=itype expected=itype sub=isub]
4827+ =. actual (itype-walk actual sub)
4828+ =. expected (itype-walk expected sub)
4829+ ?: &(?=(%face -.actual) ?=(%face -.expected))
4830+ [%face name.expected $(actual body.actual, expected body.expected)]
4831+ ?: ?=(%face -.actual)
4832+ [%face name.actual $(actual body.actual)]
4833+ ?: ?=(%face -.expected)
4834+ [%face name.expected $(expected body.expected)]
4835+ ?: &(?=(%cell -.actual) ?=(%cell -.expected))
4836+ [%cell $(actual hed.actual, expected hed.expected) $(actual tal.actual, expected tal.expected)]
4839+++ itype-output-may-be-cell
4840+ |= [t=itype sub=isub]
4842+ =. t (itype-walk t sub)
4847+ %fn |($(t sample.t) $(t product.t))
4784++ itype-fit
4851++ itype-fit
4785 |= [actual=itype expected=itype sub=isub next=@ud]
4852 |= [actual=itype expected=itype sub=isub next=@ud]
@@ -4789,6 +4856,7 @@
4789 =. actual (itype-walk actual sub)
4856 =. actual (itype-walk actual sub)
4790 =. expected (itype-walk expected sub)
4857 =. expected (itype-walk expected sub)
4791 ?: =(actual expected) [%ok sub next]
4858 ?: =(actual expected) [%ok sub next]
4859+ ?: &(uncertain (itype-face-asym actual expected sub)) [%unknown ~]
4792 ?: ?=(%any-atom -.expected)
4860 ?: ?=(%any-atom -.expected)
4793 ?: |(?=(%atom -.actual) ?=(%avar -.actual) ?=(%nvar -.actual) ?=(%flag -.actual)) [%ok sub next]
4861 ?: |(?=(%atom -.actual) ?=(%avar -.actual) ?=(%nvar -.actual) ?=(%flag -.actual)) [%ok sub next]
4794 ?: ?=(%var -.actual)
4862 ?: ?=(%var -.actual)
@@ -4819,6 +4887,12 @@
4819 ?: (itype-family-related actual expected sub) [%unknown ~]
4887 ?: (itype-family-related actual expected sub) [%unknown ~]
4820 [%bad ~]
4888 [%bad ~]
4821 [%ok u.unified next]
4889 [%ok u.unified next]
4890+ ?: &(?=(%face -.actual) ?=(%face -.expected))
4891+ ?. =(name.actual name.expected) [%bad ~]
4892+ $(actual body.actual, expected body.expected)
4893+ ?: ?=(%face -.actual) $(actual body.actual)
4894+ ?: ?=(%face -.expected) $(expected body.expected)
4895+ ?: (itype-face-asym actual expected sub) [%unknown ~]
4822 ?: |((itype-has-any-atom actual sub) (itype-has-any-atom expected sub))
4896 ?: |((itype-has-any-atom actual sub) (itype-has-any-atom expected sub))
4823 [%unknown ~]
4897 [%unknown ~]
4824 =/ unified=(unit isub) (itype-unify actual expected sub)
4898 =/ unified=(unit isub) (itype-unify actual expected sub)
@@ -4888,6 +4962,8 @@
4888 |= [t=itype sub=isub]
4962 |= [t=itype sub=isub]
4889 ^- itype
4963 ^- itype
4890 =. t (itype-walk t sub)
4964 =. t (itype-walk t sub)
4966+ [%face name.t $(t body.t)]
4891 ?: ?=(%fn -.t)
4967 ?: ?=(%fn -.t)
4892 [%fn $(t sample.t) $(t product.t)]
4968 [%fn $(t sample.t) $(t product.t)]
4893 ?: ?=(%cell -.t)
4969 ?: ?=(%cell -.t)
@@ -4905,6 +4981,7 @@
4907 %cell |($(t hed.t) $(t tal.t))
4983 %cell |($(t hed.t) $(t tal.t))
@@ -4919,6 +4996,7 @@
4919 ?: (itype-has-gate t) t
4996 ?: (itype-has-gate t) t
4921 %nvar [%atom %ud]
4998 %nvar [%atom %ud]
4999+ %face [%face name.t $(t body.t)]
4922 %cell [%cell $(t hed.t) $(t tal.t)]
5000 %cell [%cell $(t hed.t) $(t tal.t)]
@@ -4933,6 +5011,7 @@
4934 %any-atom ~
5012 %any-atom ~
4936 %fn (weld $(t sample.t) $(t product.t))
5015 %fn (weld $(t sample.t) $(t product.t))
4937 %cell (weld $(t hed.t) $(t tal.t))
5016 %cell (weld $(t hed.t) $(t tal.t))
@@ -4965,6 +5044,7 @@
4966 %any-atom t
5045 %any-atom t
5047+ %face [%face name.t $(t body.t)]
4968 %fn [%fn $(t sample.t) $(t product.t)]
5048 %fn [%fn $(t sample.t) $(t product.t)]
4969 %cell [%cell $(t hed.t) $(t tal.t)]
5049 %cell [%cell $(t hed.t) $(t tal.t)]
@@ -4982,6 +5062,7 @@
4983 %any-atom |
5063 %any-atom |
4985 %fn |($(t sample.t) $(t product.t))
5066 %fn |($(t sample.t) $(t product.t))
4986 %cell |($(t hed.t) $(t tal.t))
5067 %cell |($(t hed.t) $(t tal.t))
@@ -5176,13 +5257,25 @@
5176 |= [fields=(list field) state=istate]
5257 |= [fields=(list field) state=istate]
5177 ^- (unit [typ=itype state=istate])
5258 ^- (unit [typ=itype state=istate])
5178 ?~ fields ~
5259 ?~ fields ~
5260+ =/ field-shape=shape
5179− ?. ?=(%bare -.i.fields) ~
5262+ %bare shape.i.fields
5263+ %face shape.i.fields
5264+ %pun [%ref at.i.fields ~[name.i.fields]]
5180− =/ head=(unit [typ=itype state=istate]) (infer-simple-shape shape.i.fields state)
5266+ =/ head=(unit [typ=itype state=istate]) (infer-simple-shape field-shape state)
5181 ?~ head ~
5267 ?~ head ~
5268+ =/ t=itype typ.u.head
5272+ %face [%face name.i.fields t]
5273+ %pun [%face name.i.fields t]
5182− ?~ t.fields head
5275+ ?~ t.fields `[t state.u.head]
5183 =/ tail=(unit [typ=itype state=istate]) $(fields t.fields, state state.u.head)
5276 =/ tail=(unit [typ=itype state=istate]) $(fields t.fields, state state.u.head)
5184 ?~ tail ~
5277 ?~ tail ~
5185− `[[%cell typ.u.head typ.u.tail] state.u.tail]
5278+ `[[%cell t typ.u.tail] state.u.tail]
5187++ infer-sample
5280++ infer-sample
5188 |= [s=sample env=ienv state=istate]
5281 |= [s=sample env=ienv state=istate]
@@ -5203,9 +5296,34 @@
5203 =/ t=(unit [typ=itype state=istate]) (infer-simple-shape shape.s state)
5296 =/ t=(unit [typ=itype state=istate]) (infer-simple-shape shape.s state)
5204 ?~ t [%| "sample mold is not supported by partial inference"]
5297 ?~ t [%| "sample mold is not supported by partial inference"]
5205 [%& typ.u.t env state.u.t]
5298 [%& typ.u.t env state.u.t]
5206− * [%| "sample is not supported by partial inference"]
5299+ %pun
5300+ $(s [%face at.s name.s [%ref at.s ~[name.s]]])
5302+ (infer-sample-items items.s env state)
5305+:: Cell-sample binders are faces on their positions; at the top of a
5306+:: sample a binder only supplies a name for the whole sample.
5308+++ infer-sample-items
5309+ |= [items=(list sample) env=ienv state=istate]
5311+ ?~ items [%| "empty sample is not supported by partial inference"]
5312+ =/ head=isample-result (infer-sample i.items env state)
5313+ ?: ?=(%| -.head) head
5314+ =/ ht=itype typ.p.head
5317+ %bind [%face name.i.items ht]
5318+ %face [%face name.i.items ht]
5319+ %pun [%face name.i.items ht]
5322+ ?~ t.items [%& ht env.p.head state.p.head]
5323+ =/ tail=isample-result $(items t.items, env env.p.head, state state.p.head)
5324+ ?: ?=(%| -.tail) tail
5325+ [%& [%cell ht typ.p.tail] env.p.tail state.p.tail]
5209:: Local definitions generalize only variables outside their enclosing
5327:: Local definitions generalize only variables outside their enclosing
5210:: environment and explicit-capital scope. Unresolved groups stay
5328:: environment and explicit-capital scope. Unresolved groups stay
5211:: unsupported: this fragment does not infer recursive definitions.
5329:: unsupported: this fragment does not infer recursive definitions.
@@ -5300,6 +5418,38 @@
5300 =. vars (skim vars |=(n=@ud !(lien free |=(f=@ud =(f n)))))
5418 =. vars (skim vars |=(n=@ud !(lien free |=(f=@ud =(f n)))))
5301 $(ds t.ds, env [[name.d [typ vars]] env], state state.p.inferred, progressed &)
5419 $(ds t.ds, env [[name.d [typ vars]] env], state state.p.inferred, progressed &)
5421+:: Read only fields of a known record. Unresolved field constraints and
5422+:: ambiguous repeated faces are outside this fragment.
5424+++ record-fields-named
5425+ |= [name=term t=itype sub=isub]
5427+ =. t (itype-walk t sub)
5429+ ?:(=(name name.t) ~[body.t] ~)
5431+ =/ first=(list itype) ~
5432+ =/ head=itype (itype-walk hed.t sub)
5433+ =? first ?=(%face -.head) ?:(=(name name.head) ~[body.head] ~)
5434+ (weld first $(t tal.t))
5437+ |= [names=(list term) env=ienv state=istate]
5439+ =/ reverse=(list term) (flop names)
5440+ ?~ reverse [%| ["empty wing" ~]]
5441+ =/ scheme=(unit ischeme) (ienv-lookup i.reverse env)
5442+ ?~ scheme [%| ["field access is not supported by partial inference" ~]]
5443+ =/ inst=[typ=itype state=istate] (instantiate-scheme u.scheme state)
5444+ =/ fields=(list term) t.reverse
5445+ =/ typ=itype typ.inst
5447+ ?~ fields [%& typ state.inst]
5448+ =/ found=(list itype) (record-fields-named i.fields typ sub.state.inst)
5449+ ?~ found [%| ["field is not available to partial inference" ~]]
5450+ ?^ t.found [%| ["field name is ambiguous in partial inference" ~]]
5451+ $(fields t.fields, typ i.found)
5303++ infer-fragment
5453++ infer-fragment
5304 |= [e=expr env=ienv state=istate]
5454 |= [e=expr env=ienv state=istate]
5305 ^- iresult
5455 ^- iresult
@@ -5323,9 +5473,9 @@
5324 ?~ names.e [%| ["empty wing" ~]]
5474 ?~ names.e [%| ["empty wing" ~]]
5325 ?^ t.names.e
5475 ?^ t.names.e
5326− ?^ t.t.names.e [%| ["field access is not supported by partial inference" ~]]
5476+ ?^ t.t.names.e (infer-field-wing names.e env state)
5327 =/ iface=(unit ifile) (find-jibb-interface i.t.names.e jimports.state)
5477 =/ iface=(unit ifile) (find-jibb-interface i.t.names.e jimports.state)
5328− ?~ iface [%| ["field access is not supported by partial inference" ~]]
5478+ ?~ iface (infer-field-wing names.e env state)
5329 =/ member=(unit ischeme) (ienv-lookup i.names.e values.u.iface)
5479 =/ member=(unit ischeme) (ienv-lookup i.names.e values.u.iface)
5330 ?~ member [%| ["module member is not available to partial inference" ~]]
5480 ?~ member [%| ["module member is not available to partial inference" ~]]
5331 =/ instance=[typ=itype state=istate] (instantiate-scheme u.member state)
5481 =/ instance=[typ=itype state=istate] (instantiate-scheme u.member state)
@@ -5386,6 +5536,8 @@
5386 ?~ joined
5536 ?~ joined
5387 =/ common=(unit itype) (itype-concrete-join typ.p.left typ.p.right sub.state.p.right)
5537 =/ common=(unit itype) (itype-concrete-join typ.p.left typ.p.right sub.state.p.right)
5388 ?^ common [%& u.common state.p.right]
5538 ?^ common [%& u.common state.p.right]
5539+ ?: |((itype-has-face typ.p.left sub.state.p.right) (itype-has-face typ.p.right sub.state.p.right))
5540+ [%| ["record branch matching is not supported by partial inference" ~]]
5389 ?: |((itype-has-any-atom typ.p.left sub.state.p.right) (itype-has-any-atom typ.p.right sub.state.p.right) (itype-family-related typ.p.left typ.p.right sub.state.p.right))
5541 ?: |((itype-has-any-atom typ.p.left sub.state.p.right) (itype-has-any-atom typ.p.right sub.state.p.right) (itype-family-related typ.p.left typ.p.right sub.state.p.right))
5390 [%| ["branch widening is not supported by partial inference" ~]]
5542 [%| ["branch widening is not supported by partial inference" ~]]
5391 [%| ["branch arms have incompatible types" ~[[(span-of val.x) (site-type-note "first arm" typ.p.left sub.state.p.right)] [(span-of val.y) (site-type-note "second arm" typ.p.right sub.state.p.right)]]]]
5543 [%| ["branch arms have incompatible types" ~[[(span-of val.x) (site-type-note "first arm" typ.p.left sub.state.p.right)] [(span-of val.y) (site-type-note "second arm" typ.p.right sub.state.p.right)]]]]
@@ -5399,7 +5551,8 @@
5399 ?: ?=(%unknown -.fit) [%| ["cast constraint is not supported by partial inference" ~]]
5551 ?: ?=(%unknown -.fit) [%| ["cast constraint is not supported by partial inference" ~]]
5400 ?: ?=(%bad -.fit)
5552 ?: ?=(%bad -.fit)
5401 [%| ["cast mold and expression type do not unify" ~[[at.shape.e (site-type-note "cast mold" typ.u.target sub.state.p.value)] [(span-of val.e) (site-type-note "expression" typ.p.value sub.state.p.value)]]]]
5553 [%| ["cast mold and expression type do not unify" ~[[at.shape.e (site-type-note "cast mold" typ.u.target sub.state.p.value)] [(span-of val.e) (site-type-note "expression" typ.p.value sub.state.p.value)]]]]
5554+ =/ merged=itype (itype-merge-faces typ.p.value typ.u.target sub.fit)
5402− [%& typ.u.target state.p.value(sub sub.fit, next next.fit)]
5555+ [%& merged state.p.value(sub sub.fit, next next.fit)]
5403 %crash [%& [%var next.state] state(next +(next.state))]
5556 %crash [%& [%var next.state] state(next +(next.state))]
5405 =/ sam=isample-result (infer-sample sample.e env state)
5558 =/ sam=isample-result (infer-sample sample.e env state)
@@ -5427,6 +5580,8 @@
5427 ?: ?=(%unknown -.fit) [%| ["call constraint is not supported by partial inference" ~]]
5580 ?: ?=(%unknown -.fit) [%| ["call constraint is not supported by partial inference" ~]]
5428 ?: ?=(%bad -.fit)
5581 ?: ?=(%bad -.fit)
5429 [%| ["call's sample and argument types do not unify" ~[[(span-of head.e) (site-type-note "called gate" ht sub.st)] [(span-of i.args.e) (site-type-note "argument" typ.p.arg sub.st)]]]]
5582 [%| ["call's sample and argument types do not unify" ~[[(span-of head.e) (site-type-note "called gate" ht sub.st)] [(span-of i.args.e) (site-type-note "argument" typ.p.arg sub.st)]]]]
5583+ ?: &((itype-has-face typ.p.arg sub.fit) (itype-face-asym typ.p.arg sample.ht sub.fit) (itype-output-may-be-cell product.ht sub.fit))
5584+ [%| ["call result face propagation is not supported by partial inference" ~]]
5430 [%& product.ht st(sub sub.fit, next next.fit)]
5585 [%& product.ht st(sub sub.fit, next next.fit)]
5431 =/ result=itype [%var next.st]
5586 =/ result=itype [%var next.st]
5432 =/ uni=(unit isub) (itype-unify ht [%fn typ.p.arg result] sub.st)
5587 =/ uni=(unit isub) (itype-unify ht [%fn typ.p.arg result] sub.st)
@@ -5443,13 +5598,14 @@
5443 |= [items=(list item) env=ienv state=istate]
5598 |= [items=(list item) env=ienv state=istate]
5444 ^- iresult
5599 ^- iresult
5445 ?~ items [%| ["empty cell is not supported by partial inference" ~]]
5600 ?~ items [%| ["empty cell is not supported by partial inference" ~]]
5446− ?^ face.i.items [%| ["record faces are not supported by partial inference" ~]]
5447 =/ head=iresult (infer-fragment val.i.items env state)
5601 =/ head=iresult (infer-fragment val.i.items env state)
5448 ?: ?=(%| -.head) head
5602 ?: ?=(%| -.head) head
5603+ =/ ht=itype typ.p.head
5604+ =. ht ?~(face.i.items ht [%face u.face.i.items ht])
5449− ?~ t.items head
5605+ ?~ t.items [%& ht state.p.head]
5450 =/ tail=iresult $(items t.items, state state.p.head)
5606 =/ tail=iresult $(items t.items, state state.p.head)
5451 ?: ?=(%| -.tail) tail
5607 ?: ?=(%| -.tail) tail
5452− [%& [%cell typ.p.head typ.p.tail] state.p.tail]
5608+ [%& [%cell ht typ.p.tail] state.p.tail]
5454:: A single two-binder cell pattern covers every value of a cell type.
5610:: A single two-binder cell pattern covers every value of a cell type.
5455:: No other pattern matrix is implemented here.
5611:: No other pattern matrix is implemented here.
@@ -5474,6 +5630,8 @@
5474 =/ subject=iresult (infer-fragment subject.e env state)
5630 =/ subject=iresult (infer-fragment subject.e env state)
5475 ?: ?=(%| -.subject) subject
5631 ?: ?=(%| -.subject) subject
5476 =/ st=istate state.p.subject
5632 =/ st=istate state.p.subject
5633+ ?: (itype-has-face typ.p.subject sub.st)
5634+ [%| ["record patterns are not supported by partial inference" ~]]
5477 =/ head=itype [%var next.st]
5635 =/ head=itype [%var next.st]
5478 =/ tail=itype [%var +(next.st)]
5636 =/ tail=itype [%var +(next.st)]
5479 =/ sub=(unit isub) (itype-unify typ.p.subject [%cell head tail] sub.st)
5637 =/ sub=(unit isub) (itype-unify typ.p.subject [%cell head tail] sub.st)
@@ -5497,10 +5655,18 @@
5497 %atom "@{(trip aura.t)}"
5655 %atom "@{(trip aura.t)}"
5498 %any-atom "@"
5656 %any-atom "@"
5499 %flag "?"
5657 %flag "?"
5658+ %face "[{(trip name.t)}={$(t body.t)}]"
5500 %fn "$-({$(t sample.t)} {$(t product.t)})"
5659 %fn "$-({$(t sample.t)} {$(t product.t)})"
5501− %cell "[{$(t hed.t)} {$(t tal.t)}]"
5660+ %cell "[{(show-itype-item hed.t sub)} {(show-itype-item tal.t sub)}]"
5664+ |= [t=itype sub=isub]
5666+ =. t (itype-walk t sub)
5667+ ?: ?=(%face -.t) "{(trip name.t)}={(show-itype body.t sub)}"
5504:: Include the type at a conflicting site where it can be printed.
5670:: Include the type at a conflicting site where it can be printed.
5505:: A lone unresolved variable or decimal variable keeps the neutral label.
5671:: A lone unresolved variable or decimal variable keeps the neutral label.
@@ -5514,6 +5680,7 @@
5515 %any-atom |
5681 %any-atom |
5683+ %face $(typ body.typ)
5517 %fn |($(typ sample.typ) $(typ product.typ))
5684 %fn |($(typ sample.typ) $(typ product.typ))
5518 %cell |($(typ hed.typ) $(typ tal.typ))
5685 %cell |($(typ hed.typ) $(typ tal.typ))
@@ -5564,6 +5731,7 @@
5565 %any-atom |
5732 %any-atom |
5567 %fn |($(t sample.t) $(t product.t))
5735 %fn |($(t sample.t) $(t product.t))
5568 %cell |($(t hed.t) $(t tal.t))
5736 %cell |($(t hed.t) $(t tal.t))