▁the ▁context ▁in ▁which ▁that ▁expression ▁appears . ▁For ▁example , ▁in ▁an ▁assignment ▁statement ▁of ▁the ▁form ▁x ▁:= ▁e , ▁the ▁infer red ▁type ▁of ▁the ▁expression ▁e ▁must ▁be ▁consistent ▁with ▁the ▁declared ▁or ▁infer red ▁type ▁of ▁the ▁variable ▁x . ▁This ▁notion ▁of ▁consist ency , ▁called ▁compatibility , ▁is ▁specific ▁to ▁each ▁programming ▁language . ▁ ▁If ▁the ▁type ▁of ▁e ▁and ▁the ▁type ▁of ▁x ▁are ▁the ▁same , ▁and ▁assignment ▁is ▁allowed ▁for ▁that ▁type , ▁then ▁this ▁is ▁a ▁valid ▁expression . ▁Thus , ▁in ▁the ▁simplest ▁type ▁systems , ▁the ▁question ▁of ▁whether ▁two ▁types ▁are ▁compatible ▁reduces ▁to ▁that ▁of ▁whether ▁they ▁are ▁equal ▁( or ▁equivalent ). ▁D ifferent ▁languages , ▁however , ▁have ▁different ▁criteria ▁for ▁when ▁two ▁type ▁expressions ▁are ▁understood ▁to ▁denote ▁the ▁same ▁type . ▁These ▁different ▁equ ational ▁theories ▁of ▁types ▁vary ▁widely , ▁two ▁extreme ▁cases ▁being ▁struct ural ▁type ▁systems , ▁in ▁which ▁any ▁two ▁types ▁that ▁describe ▁values ▁with ▁the ▁same ▁structure ▁are ▁equivalent , ▁and ▁nomin ative ▁type ▁systems , ▁in ▁which ▁no ▁two ▁s ynt act ically ▁distinct ▁type ▁expressions ▁denote ▁the ▁same ▁type ▁( i . e ., ▁types ▁must ▁have ▁the ▁same ▁" name " ▁in ▁order ▁to ▁be ▁equal ). ▁ ▁In ▁languages ▁with ▁sub ty ping , ▁the ▁compatibility ▁relation ▁is ▁more ▁complex . ▁In ▁particular , ▁if ▁B ▁is ▁a ▁sub type ▁of ▁A , ▁then ▁a ▁value ▁of ▁type ▁B ▁can ▁be ▁used ▁in ▁a