Type Inference using Type Constraints Type Inference using
- Slides: 53
Type Inference using Type Constraints
Type Inference using Type Constraints o Applications of typing axioms / rules are replaced with type equations. o A 3 -stages algorithm. Given an expression, e: • Rename bound variables in e. • Assign type variables to all sub-expressions of e. • Construct type equations. • Solve the equations. Question 1: Typing the expression ((lambda (f 1 x 1)) sqrt 4) Exp: ((lambda ([f 1: [N->N]] [x 1: N]): N (f 1 x 1)) sqrt 4) STAGE-I: Rename bound variables STAGE-II: Assign type variables to all sub-exps ((lambda (f x)) sqrt 4) Expression ((lambda(f x)) sqrt 4) (lambda(f x) f x sqrt 4 Var T 0 T 1 T 2 Tf Tx Tsqrt Tnum 4
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-III: Construct type equations. 1. For atomic exps / primitive-procs, construct equations using their types. Expression Equation 2. For (lambda (v 1. . . vn) e 1. . . em), construct: T(lambda(v 1…vn) e 1…en) =[Tv 1*…*Tvn -> Ten] ((lambda (f x)) sqrt 4) (lambda (f x)) Sqrt 4 (f x) T 1 = [Tsqrt*Tnum 4→T 0] T 1 = [Tf*Tx→T 2] Tsqrt = [Number → Number] Tnum 4 = Number Tf = [Tx→T 2] 3. For (f e 1. . . en), construct: Tf =[Te 1*…*Ten -> T(f e 1 … en)] Expression ((lambda(f x)) sqrt 4) (lambda(f x) f x sqrt 4 Var T 0 T 1 T 2 Tf Tx Tsqrt Tnum 4
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: Equation 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 1. T 1 =[Tsqrt*Tnum 4→T 0] 2. T 1 =[Tf*Tx→T 2] 3. Tf =[Tx→T 2] 4. Tsqrt = [N → N] 5. Tnum 4 =N 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Substitution Equation 1: - Step 1: the empty sub is applied to Eq 1. - Eq 1 is applied to the sub.
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). T 1: =[Tsqrt*Tnum 4→T 0] 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 2. T 1 =[Tf*Tx→T 2] 3. Tf =[Tx→T 2] 4. Tsqrt = [N → N] 5. Tnum 4 =N 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation 1: - Step 1: the empty sub is applied to Eq 1. - Eq 1 is applied to the sub.
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). T 1: =[Tsqrt*Tnum 4→T 0] 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 2. T 1: =[Tf*Tx→T 2] 3. Tf: =[Tx→T 2] 4. Tsqrt : = [N → N] 5. Tnum 4: =N 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation 2: - Step 1: The sub is applied to Eq 2: [Tf* Tx -> T 2] = [Tsqrt* Tnum 4 -> T 0] - Step 5: Equations are split and Eq 2 is removed.
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). T 1: =[Tsqrt*Tnum 4→T 0] 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 2. T 1: =[Tf*Tx→T 2] 3. Tf: =[Tx→T 2] 4. Tsqrt : = [N → N] 5. Tnum 4: =N 6. Tf: =Tsqrt 7. Tx: =Tnum 4 8. T 2: =T 0 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation 2: - Step 1: The sub is applied to Eq 2: [Tf* Tx -> T 2] = [Tsqrt* Tnum 4 -> T 0] - Step 5: Equations are split and Eq 2 is removed.
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). T 1: =[Tsqrt*Tnum 4→T 0] 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. Tf: =[Tx→T 2] 4. Tsqrt : = [N → N] 5. Tnum 4: =N 6. Tf: =Tsqrt 7. Tx: =Tnum 4 8. T 2: =T 0 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation 3: - Step 1: the sub is applied to Eq 3. No change. - Eq 3 is applied to the substitution.
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 4. Tsqrt : = [N → N] 5. Tnum 4: =N 6. Tf: =Tsqrt 7. Tx: =Tnum 4 8. T 2: =T 0 T 1: =[Tsqrt*Tnum 4→T 0] 3. Tf: =[Tx→T 2] Equation 3: - Step 1: the sub is applied to Eq 3. No change. - Eq 3 is applied to the substitution.
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 4. Tsqrt : = [N → N] 5. Tnum 4: =N 6. Tf: =Tsqrt 7. Tx: =Tnum 4 8. T 2: =T 0 T 1: =[Tsqrt*Tnum 4→T 0] Tf: =[Tx→T 2] Equation 4: - Step 1: the sub is applied to Eq 4. No change. - Eq 4 is applied to the substitution: Occurrences of Tsqrt are substituted by [N→N]
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 5. Tnum 4: =N 6. Tf: =Tsqrt 7. Tx: =Tnum 4 8. T 2: =T 0 T 1: =[[N → N]*Tnum 4→T 0] Tf: =[Tx→T 2] Tsqrt : = [N → N] Equation 4: - Step 1: the sub is applied to Eq 4. No change. - Eq 4 is applied to the substitution: Occurrences of Tsqrt are substituted by [N→N]
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 5. Tnum 4: =N 6. Tf: =Tsqrt 7. Tx: =Tnum 4 8. T 2: =T 0 T 1: =[[N → N]*Tnum 4→T 0] Tf: =[Tx→T 2] Tsqrt : = [N → N] Equation 5: - Step 1: the sub is applied to Eq 5. No change. - Eq 5 is applied to the substitution: Occurrences of Tnum 4 are substituted by N
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 6. Tf: =Tsqrt 7. Tx: =Tnum 4 8. T 2: =T 0 T 1: =[[N → N]*N→T 0] Tf: =[Tx→T 2] Tsqrt : = [N → N] Tnum 4: =N Equation 5: - Step 1: the sub is applied to Eq 5. No change. - Eq 5 is applied to the substitution: Occurrences of Tnum 4 are substituted by N
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 6. Tf: =Tsqrt 7. Tx: =Tnum 4 8. T 2: =T 0 T 1: =[[N → N]*N→T 0] Tf: =[Tx→T 2] Tsqrt : = [N → N] Tnum 4: =N Equation 6: - Step 1: the sub is applied to Eq 6, Tf and Tsqrt are substituted: [Tx→T 2]=[N → N] - Step 5: Equations are split and Eq 6 is removed.
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 6. Tf: =Tsqrt 7. Tx: =Tnum 4 8. T 2: =T 0 9. Tx: =N 10. T 2: =N T 1: =[[N → N]*N→T 0] Tf: =[Tx→T 2] Tsqrt : = [N → N] Tnum 4: =N Equation 6: - Step 1: the sub is applied to Eq 6, Tf and Tsqrt are substituted: [Tx→T 2]=[N → N] - Step 5: Equations are split and Eq 6 is removed.
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 7. Tx: =Tnum 4 8. T 2: =T 0 9. Tx: =N 10. T 2: =N T 1: =[[N → N]*N→T 0] Tf: =[Tx→T 2] Tsqrt : = [N → N] Tnum 4: =N Equation 7: - Step 1: Tnum 4 is substituted: Tx=N - Step 3: Eq 7 is applied to the substitution: Any occurrence of Tx is substituted for N
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 7. Tx: =N 8. T 2: =T 0 9. Tx: =N 10. T 2: =N T 1: =[[N → N]*N→T 0] Tf: =[Tx→T 2] Tsqrt : = [N → N] Tnum 4: =N Equation 7: - Step 1: Tnum 4 is substituted: Tx=N - Step 3: Eq 7 is applied to the substitution: Any occurrence of Tx is substituted for N
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 8. T 2: =T 0 9. Tx: =N 10. T 2: =N T 1: =[[N → N]*N→T 0] Tf: =[N→T 2] Tsqrt : = [N → N] Tnum 4: =N Tx: =N Equation 7: - Step 1: Tnum 4 is substituted: Tx=N - Step 3: Eq 7 is applied to the substitution: Any occurrence of Tx is substituted for N
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 8. T 2: =T 0 9. Tx: =N 10. T 2: =N T 1: =[[N → N]*N→T 0] Tf: =[N→T 2] Tsqrt : = [N → N] Tnum 4: =N Tx: =N Equation 8: - step 1: the sub is applied to Eq 8. No change. - Step 3: Eq 8 is applied to the sub: Any occurrence of T 2 is substituted for T 0
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 9. Tx: =N 10. T 2: =N 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. T 1: =[[N → N]*N→T 0] Tf: =[N→T 0] Tsqrt : = [N → N] Tnum 4: =N Tx: =N T 2: =T 0 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation 8: - step 1: the sub is applied to Eq 8. No change. - Eq 8 is applied to the sub: Any occurrence of T 2 is substituted for T 0
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 9. Tx: =N 10. T 2: =N 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. T 1: =[[N → N]*N→T 0] Tf: =[N→T 0] Tsqrt : = [N → N] Tnum 4: =N Tx: =N T 2: =T 0 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation 9: - Step 1: Tx is substituted: N=N - Step 2: Eq 9 is removed.
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 9. N: =N 10. T 2: =N 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. T 1: =[[N → N]*N→T 0] Tf: =[N→T 0] Tsqrt : = [N → N] Tnum 4: =N Tx: =N T 2: =T 0 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation 9: - Step 1: Tx is substituted: N=N - Step 2: Eq 9 is removed.
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. A circular substitution occurred? Output FAIL. 5. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 10. T 2: =N T 1: =[[N → N]*N→T 0] Tf: =[N→T 0] Tsqrt : = [N → N] Tnum 4: =N Tx: =N T 2: =T 0 Equation 10: - step 1: T 2 is substituted: T 0=N - Step 3: Eq 10 is applied to the sub: Any occurrence of T 0 is substituted for N
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. A circular substitution occurred? Output FAIL. 5. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 10. T 0: =N T 1: =[[N → N]*N→T 0] Tf: =[N→T 0] Tsqrt : = [N → N] Tnum 4: =N Tx: =N T 2: =T 0 Equation 10: - step 1: T 2 is substituted: T 0=N - Step 3: Eq 10 is applied to the sub: Any occurrence of T 0 is substituted for N
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. A circular substitution occurred? Output FAIL. 5. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution T 1: =[[N → N]*N→N] Tf: =[N→N] Tsqrt : = [N → N] Tnum 4: =N Tx: =N T 2: =N T 0: =N Equation 10: - step 1: T 2 is substituted: T 0=N - Step 3: Eq 10 is applied to the sub: Any occurrence of T 0 is substituted for N
Type Inference using Type Constraints Question 1 (cont’d): Typing the application ((lambda (f x)) sqrt 4) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. A circular substitution occurred? Output FAIL. 5. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution T 1: =[[N → N]*N→N] Tf: =[N→N] Tsqrt : = [N → N] Tnum 4: =N Tx: =N T 2: =N T 0: =N Equation 10: - step 1: T 2 is substituted: T 0=N - Step 3: Eq 10 is applied to the sub: Any occurrence of T 0 is substituted for N The inference succeeds! The type of T 0 is Number Exp: ((lambda ([f 1: [N->N]] [x 1: N]): N (f 1 x 1)) sqrt 4)
Type Inference using Type Constraints Question 2: Extending the typing mechanism for if expressions. Recall the typing rule for if expressions (if p c a): For every: type environment _Tenv, expressions _e 1, _e 2, _e 3, and type expressions _S 1, _S 2: if _Tenv |- _e 1: Boolean, _Tenv |- _e 2: _S 2, _Tenv |- _e 3: _S 2, Then _Tenv |- (if _e 1 _e 2 _e 3): _S 2 Observations: • P is of type Boolean • c and a have the same type: _S 2. • This is also the type for the entire if expression. What would be the equation for if in the constraints approach? For the expression (if p c a), construct: Tc=Ta, Tif =Tc
Type Inference using Type Constraints Example: Typing the expression (if #t (+ 1 2) 3) Exp: Typing the expression (if [#t: T#t] [(+ 1 2): T 1] [3: Tnum 3]): T 0 STAGE-I: Rename bound variables Not needed, no references of variables. STAGE-II: Assign type variables to all sub-exps Expression (if #t (+ 1 2) 3) (+ 1 2) + #t 1 2 3 Var T 0 T 1 T+ T#t Tnum 1 Tnum 2 Tnum 3
Type Inference using Type Constraints Example: Typing the expression (if #t (+ 1 2) 3) STAGE-III: Construct type equations. 1. For atomic exps / primitive-procs, construct equations using their types. 2. For (lambda (v 1. . . vn) e 1. . . em), construct: T(lambda(v 1…vn) e 1…en) =[Tv 1*…*Tvn -> Ten] 3. For (f e 1. . . en), construct: Tf =[Te 1*…*Ten -> T(f e 1 … en)] 4. For (if p c a), construct: Tc=Ta, Tif =Tc Expression Equation (if #t (+ 1 2) 3) T 1=Tnum 3 T 0 = T 1 T+=[Tnum 1*Tnum 2 ->T 1] T+->[N*N->N] T#t = Boolean Tnum 1 = Number Tnum 2 = Number Tnum 3 = Number (+ 1 2) + #t 1 2 3 Expression (if #t (+ 1 2) 3) (+ 1 2) + #t 1 2 3 Var T 0 T 1 T+ T#t Tnum 1 Tnum 2 Tnum 3
Type Inference using Type Constraints Example: Typing the expression (if #t (+ 1 2) 3) STAGE-IV: Solving the equations. For each equation: Equation 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 1. T 1=Tnum 3 2. T 0 = T 1 3. T+=[Tnum 1*Tnum 2 ->T 1] 4. T+->[N*N->N] 5. T#t = B 6. Tnum 1 = N 7. Tnum 2 = N 8. Tnum 3 = N 4. A circular substitution occurred? Output FAIL. 5. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Substitution Equation 1: - Step 1: the sub is applied to Eq 1. - Eq 1 is applied to the sub.
Type Inference using Type Constraints Example: Typing the expression (if #t (+ 1 2) 3) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 1. T 1=Tnum 3 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 2. T 0 = T 1 3. T+=[Tnum 1*Tnum 2 ->T 1] 4. T+->[N*N->N] 5. T#t = B 6. Tnum 1 = N 7. Tnum 2 = N 8. Tnum 3 = N 4. A circular substitution occurred? Output FAIL. 5. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation 1: - Step 1: the sub is applied to Eq 1. - Eq 1 is applied to the sub.
Type Inference using Type Constraints Example: Typing the expression (if #t (+ 1 2) 3) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 1. T 1=Tnum 3 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 2. T 0 = T 1 3. T+=[Tnum 1*Tnum 2 ->T 1] 4. T+->[N*N->N] 5. T#t = B 6. Tnum 1 = N 7. Tnum 2 = N 8. Tnum 3 = N 4. A circular substitution occurred? Output FAIL. 5. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation 2: - Step 1: T 1 is substituted: T 0 = Tnum 3 - Step 3: Eq 2 is applied to the sub.
Type Inference using Type Constraints Example: Typing the expression (if #t (+ 1 2) 3) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 1. T 1=Tnum 3 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 2. T 0 = Tnum 3 3. T+=[Tnum 1*Tnum 2 ->T 1] 4. T+->[N*N->N] 5. T#t = B 6. Tnum 1 = N 7. Tnum 2 = N 8. Tnum 3 = N 4. A circular substitution occurred? Output FAIL. 5. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation 2: - Step 1: T 1 is substituted: T 0 = Tnum 3 - Step 3: Eq 2 is applied to the sub.
Type Inference using Type Constraints Example: Typing the expression (if #t (+ 1 2) 3) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 1. T 1=Tnum 3 2. T 0 = Tnum 3 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. T+=[Tnum 1*Tnum 2 ->T 1] 4. T+->[N*N->N] 5. T#t = B 6. Tnum 1 = N 7. Tnum 2 = N 8. Tnum 3 = N 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. A circular substitution occurred? Output FAIL. 5. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation 2: - Step 1: T 1 is substituted: T 0 = Tnum 3 - Step 3: Eq 2 is applied to the sub.
Type Inference using Type Constraints Example: Typing the expression (if #t (+ 1 2) 3) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 1. T 1=Tnum 3 2. T 0 = Tnum 3 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. T+=[Tnum 1*Tnum 2 ->T 1] 4. T+->[N*N->N] 5. T#t = B 6. Tnum 1 = N 7. Tnum 2 = N 8. Tnum 3 = N 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. A circular substitution occurred? Output FAIL. 5. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation 3: - Step 1: The sub is applied to Eq 3: T+ = [Tnum 1*Tnum 2 ->Tnum 3] - Step 3: Eq 3 is applied to the sub.
Type Inference using Type Constraints Example: Typing the expression (if #t (+ 1 2) 3) STAGE-IV: Solving the equations. For each equation: Equation 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. T+=[Tnum 1*Tnum 2 ->Tnum 3] 1. T 1=Tnum 3 2. T 0 = Tnum 3 4. T+->[N*N->N] 5. T#t = B 6. Tnum 1 = N 7. Tnum 2 = N 8. Tnum 3 = N 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. A circular substitution occurred? Output FAIL. 5. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Substitution Equation 1: - Step 3: The sub is applied to Eq 3: T+ = [Tnum 1*Tnum 2 ->Tnum 3] - Step 3: Eq 3 is applied to the sub.
Type Inference using Type Constraints Example: Typing the expression (if #t (+ 1 2) 3) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 1. T 1=Tnum 3 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 4. T+->[N*N->N] 5. T#t = B 6. Tnum 1 = N 7. Tnum 2 = N 8. Tnum 3 = N 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. A circular substitution occurred? Output FAIL. 5. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. 2. T 0 = Tnum 3 3. T+=[Tnum 1*Tnum 2 ->Tnum 3] Equation 1: - Step 3: The sub is applied to Eq 3: T+ = [Tnum 1*Tnum 2 ->Tnum 3] - Step 3: Eq 3 is applied to the sub.
Type Inference using Type Constraints Example: Typing the expression (if #t (+ 1 2) 3) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 1. T 1=Tnum 3 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 4. T+->[N*N->N] 5. T#t = B 6. Tnum 1 = N 7. Tnum 2 = N 8. Tnum 3 = N 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. A circular substitution occurred? Output FAIL. 5. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. 2. T 0 = Tnum 3 3. T+=[Tnum 1*Tnum 2 ->Tnum 3] Equation 4: - Step 1: The sub is applied to Eq 4: [Tnum 1*Tnum 2 ->Tnum 3] = [N * N -> N] - Step 5: Eq 4 is split into existing equations, then removed.
Type Inference using Type Constraints Example: Typing the expression (if #t (+ 1 2) 3) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 1. T 1=Tnum 3 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 4. T+->[N*N->N] 5. T#t = B 6. Tnum 1 = N 7. Tnum 2 = N 8. Tnum 3 = N 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. A circular substitution occurred? Output FAIL. 5. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. 2. T 0 = Tnum 3 3. T+=[Tnum 1*Tnum 2 ->Tnum 3] Equation 4: - Step 1: The sub is applied to Eq 4: [Tnum 1*Tnum 2 ->Tnum 3] = [N * N -> N] - Step 5: Eq 4 is split into existing equations, then removed.
Type Inference using Type Constraints Example: Typing the expression (if #t (+ 1 2) 3) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 1. T 1=Tnum 3 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 5. T#t = B 6. Tnum 1 = N 7. Tnum 2 = N 8. Tnum 3 = N 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. A circular substitution occurred? Output FAIL. 5. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. 2. T 0 = Tnum 3 3. T+=[Tnum 1*Tnum 2 ->Tnum 3] - Applying the sub to Eq 5 -8 makes no difference. - Applying the equations to the sub, we get…
Type Inference using Type Constraints Example: Typing the expression (if #t (+ 1 2) 3) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. A circular substitution occurred? Output FAIL. 5. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 1. T 1=N 2. T 0 = N 3. T+=[N*N->N] 5. T#t = B 6. Tnum 1 = N 7. Tnum 2 = N 8. Tnum 3 = N • The inference succeeds • The expression is well-typed • The type of T 0 is Number (if [#t: Boolean] [(+ 1 2): N] [3: N]): N
Type Inference using Type Constraints Question 3: Typing the application ((lambda (f 1 x 1)) 4 sqrt) ((lambda ([f 1: Tf] [x 1: Tx]): T 0 (f 1 x 1)) 4 sqrt) STAGE-I: Rename bound variables STAGE-II: Assign type variables to all sub-exps ((lambda (f x)) 4 sqrt) Expression Var ((lambda(f x)) sqrt 4) (lambda(f x)) T 0 T 1 T 2 Tf Tx Tnum 4 Tsqrt (f x) f x 4 sqrt
Type Inference using Type Constraints Question 3 (cont’d): Typing the application ((lambda (f x)) 4 sqrt) STAGE-III: Construct type equations. 1. For atomic exps / primitive-procs, construct equations using their types. Expression Equation ((lambda (f x)) 4 sqrt) (lambda (f x)) 2. For (lambda (v 1. . . vn) e 1. . . em), construct: T(lambda(v 1…vn) e 1…en) =[Tv 1*…*Tvn -> Ten] 4 sqrt (f x) T 1: =[Tnum 4*Tsqrt→T 0] T 1: =[Tf*Tx→T 2] Tnum 4: =N Tsqrt : = [N → N] Tf: =[Tx→T 2] 3. For (f e 1. . . en), construct: Tf =[Te 1*…*Ten -> T(f e 1 … en)] Expression Var ((lambda(f x)) sqrt 4) (lambda(f x)) 4. For (if p c a), construct: Tc=Ta, Tif =Tc (f x) f x 4 sqrt T 0 T 1 T 2 Tf Tx Tnum 4 Tsqrt
Type Inference using Type Constraints Question 3 (cont’d): Typing the application ((lambda (f x)) 4 sqrt) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). T 1: =[Tnum 4*Tsqrt→T 0] 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 2. T 1: =[Tf*Tx→T 2] 3. Tf: =[Tx→T 2] 4. Tnum 4: =N 5. Tsqrt : = [N → N] 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation 1: - Apply step 1: Initially, the substitution is empty. - Eq 1 is moved to the substitution.
Type Inference using Type Constraints Question 2 (cont’d): Typing the application ((lambda (f x)) 4 sqrt) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). T 1: =[Tnum 4*Tsqrt→T 0] 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 2. T 1: =[Tf*Tx→T 2] 3. Tf: =[Tx→T 2] 4. Tnum 4: =N 5. Tsqrt : = [N → N] 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. A circular substitution occurred? Output FAIL. 5. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation 2: - step 1: T 1 is replaced by current substitution: [Tf* Tx -> T 2] = [Tnum 4* Tsqrt -> T 0] - Both side are composite, apply step 5: Equations are split and Eq 2 is removed.
Type Inference using Type Constraints Question 2 (cont’d): Typing the application ((lambda (f x)) 4 sqrt) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). T 1: =[Tnum 4*Tsqrt→T 0] 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 2. T 1: =[Tf*Tx→T 2] 3. Tf: =[Tx→T 2] 4. Tnum 4: =N 5. Tsqrt : = [N → N] 6. Tf: =Tnum 4 7. Tx: =Tsqrt 8. T 2: =T 0 4. A circular substitution occurred? Output FAIL. 5. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation 2: - step 1: T 1 is replaced by current substitution: [Tf* Tx -> T 2] = [Tnum 4* Tsqrt -> T 0] - Both side are composite, apply step 5: Equations are split and Eq 2 is removed.
Type Inference using Type Constraints Question 2 (cont’d): Typing the application ((lambda (f x)) 4 sqrt) STAGE-IV: Solving the equations. For each equation: Equation Substitution 1. Apply the current substitution to the equation (replace vars by their substituting expressions). T 1: =[Tnum 4*Tsqrt→T 0] 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. Tf: =[Tx→T 2] 4. Tnum 4: =N 5. Tsqrt : = [N → N] 6. Tf: =Tnum 4 7. Tx: =Tsqrt 8. T 2: =T 0 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation 3: - step 1: No change. - Eq 3 is added to the substitution.
Type Inference using Type Constraints Question 2 (cont’d): Typing the application ((lambda (f x)) 4 sqrt) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 4. Tnum 4: =N 5. Tsqrt : = [N → N] 6. Tf: =Tnum 4 7. Tx: =Tsqrt 8. T 2: =T 0 T 1: =[Tnum 4*Tsqrt→T 0] Tf: =[Tx→T 2] Equation 3: - step 1: No change. - Eq 3 is added to the substitution.
Type Inference using Type Constraints Question 2 (cont’d): Typing the application ((lambda (f x)) 4 sqrt) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 4. Tnum 4: =N 5. Tsqrt : = [N → N] 6. Tf: =Tnum 4 7. Tx: =Tsqrt 8. T 2: =T 0 T 1: =[Tnum 4*Tsqrt→T 0] Tf: =[Tx→T 2] Equation 4: - step 1: No change. - Eq 4 is added to the substitution: Any occurrence of Tnum 4 is substituted by N
Type Inference using Type Constraints Question 2 (cont’d): Typing the application ((lambda (f x)) 4 sqrt) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 5. Tsqrt : = [N → N] 6. Tf: =Tnum 4 7. Tx: =Tsqrt 8. T 2: =T 0 T 1: =[N*Tsqrt→T 0] Tf: =[Tx→T 2] Tnum 4: =N Equation 4: - step 1: No change. - Eq 4 is added to the substitution: Any occurrence of Tnum 4 is substituted by N
Type Inference using Type Constraints Question 2 (cont’d): Typing the application ((lambda (f x)) 4 sqrt) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 5. Tsqrt : = [N → N] 6. Tf: =Tnum 4 7. Tx: =Tsqrt 8. T 2: =T 0 T 1: =[N*Tsqrt→T 0] Tf: =[Tx→T 2] Tnum 4: =N Equation 5: - step 1: No change. - Eq 5 is added to the substitution: Any occurrence of Tsqrt is substituted by [N→N]
Type Inference using Type Constraints Question 2 (cont’d): Typing the application ((lambda (f x)) 4 sqrt) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. 5. A circular substitution occurred? Output FAIL. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 6. Tf: =Tnum 4 7. Tx: =Tsqrt 8. T 2: =T 0 T 1: =[N*[N → N]→T 0] Tf: =[Tx→T 2] Tnum 4: =N Tsqrt : = [N → N] Equation 5: - step 1: No change. - Eq 5 is added to the substitution: Any occurrence of Tsqrt is substituted by [N→N]
Type Inference using Type Constraints Question 2 (cont’d): Typing the application ((lambda (f x)) 4 sqrt) STAGE-IV: Solving the equations. For each equation: 1. Apply the current substitution to the equation (replace vars by their substituting expressions). 2. Both sides of the eq. are atomic types? 1. If not equal, output FAIL. 2. Else, do nothing. 3. One side is a variable? 1. Apply the equation to the substitution. 2. Add the equation to the substitution. 4. A circular substitution occurred? Output FAIL. 5. Both side are composite with the same type constructor? Split into equations between corresponding components and add to the set of equations. Equation Substitution 6. Tf: =Tnum 4 7. Tx: =Tsqrt 8. T 2: =T 0 T 1: =[N*[N → N]→T 0] Tf: =[Tx→T 2] Tnum 4: =N Tsqrt : = [N → N] Equation 6: - step 1: Tf and Tnum 4 are substituted: [Tx→T 2]=N - We get a conflicting equation and neither of the further steps is valid. THE EXPRESSION IS NOT WELL-TYPED.
- Specifications and constraints
- Constraints enforce rules at the table level.
- Relational database constraints
- Sql integrity constraints
- Constraints in dbms
- Linear programming in quantitative techniques
- Quadruple constraint
- Drew rosen
- Non negativity constraints
- What decisions are involved in channel management
- Conversational constraints theory
- Integrity constraints types
- What are constraints
- Logical constraints in hci
- In a marketing decision constraints are
- Entity 415
- Integrity constraints types
- Example of rheonomic constraints
- Cultural constraints on managers
- Example of environmental constraints
- Non negativity constraints
- Cultural constraints in management theories
- Tuple based check constraints
- List three of the commonly used assembly constraints
- Big m method maximization
- Materiality constraint adalah
- Realistic constraints
- Improperly constrained
- Biological constraints example
- Don norman constraints
- Constraints design principle
- Theory of constraints
- Project problem definition
- Basic constraints in sql
- Shortest path linear programming
- Difference constraints and shortest paths
- Menu rationalization
- Family of orientation
- Incremental life cycle
- Design is achieving goals within constraints
- Constraints in a design brief
- What are constraints in accounting
- Define design statement
- Relational model constraints
- Unitar united nations
- Inventory management accounting
- Rforf
- Lagrange undetermined multipliers
- Design process outline
- Quadruple constraints of project management
- Constraints in a design brief
- Quadruple constraints in project management
- Marriages and families changes choices and constraints
- Progressing emergent constraints on future climate change