� ✁ ✄ ✡ ☞ ✌ ✍ � ✁ ✂ � ✂ ✁ � ✟ ✄ ✄☎ ✆ ✡ ☞ ✌ ✍ ✞ � ✂ ✂ ✆ ✄ ✝ ✁ ✂ ✡ ✁ ☛ ✄ ✁ � ✁ ✂ ✆ ✡ ✄ ✂ � — no dependent types ✞✠✟ let Hindley-Milner: Type quantification and application can be made implicit. Split left hand sides using type information An Introduction to Type Theory – p.6/32
� ✂ ✁ ✂ � ✟ ✄ ✄☎ ✆ � ☞ ✌ ✍ � ✁ � ✁ ✁ ✂ � ✟ ✄ ✄☎ ✆ � ✟ ✡ ✆ ☞ ✌ ✍ � ✂ ✁ ✂ ✆ ✄ ✝ ✁ ✂ ✡ ✄ ☛ ✂ ✁ � ✁ � ✆ ✞ ✍ ✌ ☞ ✡ ✄ ✡ � ✂ ✁ � ✂ ✄ — no dependent types ✞✠✟ let Hindley-Milner: Type quantification and application can be made implicit. Split left hand sides using type information An Introduction to Type Theory – p.6/32
� ✂ ✁ ✂ � ✟ ✄ ✄☎ ✆ � ☞ ✌ ✄ � ✁ � ✁ ✁ ✂ � ✟ ✄ ✄☎ ✆ � ✟ ✡ ✆ ☞ ✌ ✍ � ✂ ✁ ✂ ✆ ✄ ✝ ✁ ✂ ✡ ✄ ☛ ✂ ✁ � ✁ � ✆ ✞ ✍ ✌ ☞ ✡ ✄ ✡ � ✂ ✁ � ✂ ✄ — no dependent types ✞✠✟ let Hindley-Milner: Type quantification and application can be made implicit. Split left hand sides using type information An Introduction to Type Theory – p.6/32
� ✌ ✁ � ✂ ✁ � ✄ ☞ � � ✆ ✄☎ ✄ ✟ � ✂ ✟ ✁ ✌ ✡ ☎ ✄ ✂ ✁ � ☞ ✄ ✆ ✡ ✟ � ✆ ✄☎ ✁ ✂ � ✆ ✆ ✄ ✝ ✁ ✂ ✡ ✄ ☛ ✂ ✁ � ✂ ✂ ✁ ✡ ✡ ✁ � ✍ ✄ ☞ ✌ ✄ ✞ � ✂ ✁ � ✂ — no dependent types ✞✠✟ let Hindley-Milner: Type quantification and application can be made implicit. Split left hand sides using type information An Introduction to Type Theory – p.6/32
� ✂ � ✟ ✄ ✄☎ ✆ � ☞ ✌ ✄ � ✁ ✂ � ✁ � ✁ ☞ ✡ ✄☎ ✂ ✁ � ✌ ✆ ✟ ✡ ✟ � ✆ ✄☎ ✄ ✂ � ✁ ✂ ✆ ✄ ✝ ✁ ✂ ✡ ✄ ☛ ✂ ✁ � ✁ ✂ ✆ ✡ ✄ ✁ � ✍ ✌ ☞ ✡ ✄ ✞ � ✂ ✁ � ✂ is not good ✞✠✟ let An Introduction to Type Theory – p.7/32
� ✂ ✟ � ✆ ✄☎ ✄ ✟ � ✁ ✆ � ✂ ✁ � ✄ ✌ ☞ ✡ ☞ ✁ ✁ ✆ ☎ ✄ ✂ ✁ � ✂ � ✌ ✂ ✁ � ✡ ✄☎ ✂ ✁ � � ✆ ✄☎ ✂ ✄ ✆ ✂ ✁ � ✁ ☛ ✂ ✄ ✡ ✂ ✁ ✝ ✄ ✆ ✄ ✡ � � ✟ � ✂ ✁ � ✂ ✁ ✁ ✍ ✌ ☞ ✡ ✄ ✞ � ✂ is not good ✞✠✟ let The function is partial leads to a runtime error. An Introduction to Type Theory – p.7/32
� ✟ ✆ ✡ ✟ � ✆ ✄☎ ✄ � ✌ ✂ ✁ � ✂ ✁ � ✄ ✁ ☞ � � � ✂ ✁ � ✆ ☎ ✄ ✂ ✁ ✂ ✁ ✁ � ✂ ✁ � ✡ ✄☎ ✂ ☞ ✌ ✆ ✂ ✄ ✄☎ ✆ ✂ ✁ � ✁ ☛ � ✄ ✡ ✂ ✁ ✝ ✄ ✆ ✂ ✡ ✁ � ✄ ✟ � ✂ ✁ � ✂ ✁ ✂ ✍ ✌ ☞ ✡ ✄ ✞ � is not good ✞✠✟ let The function is partial leads to a runtime error. Reason: The type of is not informative enough. An Introduction to Type Theory – p.7/32
An Introduction to Type Theory – p.8/32 ✂ ✂ ✄ ✄ ☎ ✄ ✂ ✁ ☎ ✟ ✞ ✝ ✄ � ✄ ✄ ✄ � � ✂ ✁ ✝ ✄ ✄☎ ✄ ✟ ✝ � ✂ ✁ ✂ ✁ ✟ ✞ ✞ ☎ ✟ ✄ ✄ ☎ � ✄ ☛ ✂ ✁ ✡ ✄ ☛ ✂ ✁ ✄ ✡ ☛ ✂ ✂ ✁ ✂ ✄ ☎ ✝ ☛ ✁ ✂ ✄ ☎ ✂ ✁ ✞✠✟ where data types where ✞✠✟ data data
An Introduction to Type Theory – p.8/32 ✄ ✞ ✄ ✄ ✝ ✞ ✟ ✁ ✂ ✄ ✄ ✂ ✄ ☎ ✝ ☎ ✞ ✟ ✁ ✂ ✁ ✂ � ✟ ✄ ✄☎ ✄ ✝ ✁ ✂ � ✄ ✂ ✟ ✄ ☎ � ✄ ☛ ✂ ✁ ✡ ✄ ☛ ✂ ✁ ✡ ✂ ✄ ☛ ✂ ✁ ✂ ✄ ☎ ✝ ☛ ✁ ✁ ✞✠✟ where data types where ✞✠✟ data data
✁ � Better data types, better An Introduction to Type Theory – p.9/32
✓ ✝ � ✜ � ✔ � ✁ ✛ ✄ ✁ ✝ ✂ ✝ ✛ � ✜ ☛ ✆ ✝ ✁ ✛ ✂ ✝ ✛ ✁ ✔ � ✁ � ✄ ✜ ✂ ✝ � ✁ ✁ ✄ � ✁ ✓ ✄ ☎ ☛ ✆ ✂ Better data types, better ☞✂✁ ☞✂✁ ☞✂✁ data where An Introduction to Type Theory – p.9/32
An Introduction to Type Theory – p.9/32 ✌ ✠ ✄ ✁ � ☎ � ✙ ✑ ✁ ✁ ✝ � ✛ ✂ ✄ ✁ � � ✙ ✑ ✁ ✄ ✁ ✁ ✠ ✄ � ✠ ✔ � ✜ ✓ � ✙ ✑ ✁ ✁ ✄ ✠ ✁ ✆ ✜ ✛ ✒ ✙ ✂ � � ✙ ✑ ✁ � ✄ ✁ ✄ � ✜ ✓ ✛ ✝ ✂ ✁ ✆ ☛ ☎ ✁ � � ✄ ✁ � ✛ ✝ ✂ ✄ ✁ � ✁ � ✔ ✁ ☛ ✛ ✝ ✂ ✁ ✝ � ✆ ✜ ✜ � ✛ ✝ ✂ ✁ ✝ ✄ ✔ ✓ Better data types, better ☞✂✁ ☞✂✁ ☞✂✁ where where ☞✂✁ ☞✂✁ data data
� � ✁ ✌ ✝ ✛ ✂ ✄ ✁ � ✙ ✑ ✑ ✁ ✑ ✄ ✙ ✁ � ✄ ✁ ✁ ✙ � � ✄ ✠ ✠ ✜ ✛ ✒ ✙ ✂ � � ✙ ✑ ✁ ✁ ✠ ✄ � ✁ ✠ ☎ � ✔ ✁ � ☛ ☎ ✄ ✓ ✁ � ✄ ✁ ✛ ✂ ✝ ✂ ✜ ✄ � ✁ � ✔ ✁ ✁ ✝ � ✜ ✜ ✓ ✛ ✝ ✂ ✁ ✝ ☛ � ✛ ✛ ✝ ✂ ✁ ✝ ✔ � ✜ ✓ ✁ Better data types, better ☞✂✁ ☞✂✁ data where ☞✂✁ data where An Introduction to Type Theory – p.9/32
An Introduction to Type Theory – p.9/32 ✙ ✁ ✁ ✄ ✠ ✠ ✜ ✛ ✒ ✙ ✂ � � ✑ ✙ ✁ ✁ ✠ ✄ � ✁ ✠ ☎ � ✙ ✑ ✁ ✁ ✌ ✑ � � ✁ � ✁ ✝ � ✆ ✁ ✄ ✛ � ✛ ✝ ✂ ✝ ✓ � � ✙ ✑ ✁ ✁ � ✄ ✁ � ✔ � ✜ ✝ ✛ ✂ ☎ ✄ ✝ ✔ � ✜ ✓ ✛ ✝ ✂ ✁ ☛ ✄ ✝ ✁ � ✄ ✁ � ✛ ✝ ✂ ✄ ✁ � ✁ ✂ ✁ ✛ � ✁ � � ✙ ✑ ✁ ✄ ✁ � ✄ � ✁ ✔ ✝ � ✜ ✜ ☛ ✓ ✛ ✝ ✁ ✂ Better data types, better ☞✂✁ ☞✂✁ where where let ☞✂✁ ☞✂✁ data data
An Introduction to Type Theory – p.9/32 ✁ ✠ ✠ ✜ ✛ ✒ ✙ ✂ � � ✙ ✑ ✁ ✠ ✄ ✁ � ✁ ✠ ☎ � ✙ ✑ ✁ ✁ ✌ ✝ ✛ ✄ ✁ ✄ ✝ � ✁ ✝ � ✁ ✄ ✛ � ✛ ✝ ✂ ✁ � ✑ � ✙ ✑ ✁ ✁ � ✔ � ✜ ✓ � ✙ ✂ ✁ � ✄ ✝ ✔ � ✜ ✓ ✛ ✝ ✂ ✁ ☛ ☎ ✁ ✂ � ✄ ✁ � ✛ ✝ ✂ ✄ ✁ � ✁ � ✁ ✝ � ✑ ✁ � ✄ ✁ � ✛ ✙ ✔ ✜ ✁ � ✓ ✛ ✝ ✂ ✁ ✝ ☛ ✜ � ✄ Better data types, better ☞✂✁ where where let ☞✂✁ ☞✂✁ data data
An Introduction to Type Theory – p.9/32 � � ✙ ✑ ✁ ✁ ✄ ✠ ✠ ✜ ✛ ✒ ✙ ✂ � ✜ ✙ ✑ ✁ ✁ ✠ ✄ � ✁ ✠ ☎ � ✙ ✑ ✁ ✓ � ✌ ✄ ✂ ✁ � � � ✁ ✄ ✛ � ✁ ✝ � ✁ ✛ ✔ � ✛ ✝ ✂ ✁ ✝ � � ✙ ✑ ✁ ✁ � ✁ ✝ � ☎ ✂ ✁ ✝ ✔ � ✜ ✓ ✛ ✝ ✂ ✁ ☛ ✄ ✛ ✁ � ✄ ✁ � ✛ ✝ ✂ ✄ ✁ � ✁ ✛ ✝ � ✁ ✂ ✄ ✁ � � ✙ ✑ ✁ ✄ ✁ ✜ ✄ � � ✓ ☛ ✝ ✁ ✂ ✛ ✝ ✜ � ✔ Better data types, better ☞✂✁ where where let ☞✂✁ ☞✂✁ data data
An Introduction to Type Theory – p.9/32 ✄ ✙ ✑ ✁ ✁ � ✔ � ✜ ✓ � ✙ ✑ ✁ ✁ ✠ � ✙ ✁ � ✠ ✄ ✁ ✁ ✑ � ✠ � ✂ ✙ ✒ ✛ ✜ � ✝ � ✓ ✁ ✂ ✛ ✄ ✁ � ✜ ☛ ☛ ✝ ✔ � ✁ ✂ � ☎ ✁ ✁ ✂ ✝ ✛ � ✛ ✄ � � ✝ ✁ � ✛ ✄ ✁ ✠ ☎ � ✁ ✜ � ✛ ✝ ✂ ✁ ✝ ✔ � ✜ ✓ ✛ ✝ ✂ ☛ ✝ ☎ ✄ ✁ � ✄ ✁ � ✛ ✝ ✂ ✄ ✁ � ✁ ✙ ☛ ✁ ✂ ✑ ✁ ✁ ✌ ✝ ✛ ✂ ✄ ✁ � � ✙ ✑ ✁ ✄ � ✝ ✛ ✓ ✜ � ✔ ✁ ✄ � ✁ Better data types, better ☞✂✁ where where let ☞✂✁ ☞✂✁ data data
An Introduction to Type Theory – p.9/32 ✑ ✜ � ✔ � ✁ ✁ ✙ � � � ✝ ✁ ✂ ✝ ✓ ✙ � ✙ ✁ ✑ ✙ � � ✂ ✒ ✑ ✛ ✜ ✠ ✠ ✄ ✁ ✁ ✛ ✛ � � � ✁ ✂ ✛ ✄ ✁ ✓ ☎ ✜ ☛ ✝ ✔ � ✁ ✂ ☛ ✔ ✄ ✄ ✁ � ✝ ✁ � ✛ ✁ ✠ ✄ ✓ ✂ ✙ ✒ ✛ ✜ ✠ ✁ ✠ ✄ � ✁ ✛ ✓ ✜ � ✔ ✝ ✂ ✂ ✝ ✛ � ✜ ☛ ✝ ✝ ✁ ✂ ✛ ✁ � ✁ ✄ ✂ ✝ � ☛ ✁ ✄ � ✁ ✄ ☎ ✁ ✁ ✝ ✌ � ✁ ✄ ✂ ✛ ✝ ✁ ✙ ✁ ✑ ✙ � ☎ ✠ ✛ � ✑ ✄ ✓ ✜ � ✔ � ✁ ✁ � ✁ ✄ Better data types, better ☞✂✁ where where let ☞✂✁ ☞✂✁ data data
An Introduction to Type Theory – p.9/32 ✝ ✑ ✙ � � ✝ ✁ ✂ ✛ ✁ � ✛ ✄ ✁ � ✝ ✁ ✁ � ✛ ✄ ✂ ✙ ✒ ✛ ✜ ✠ ✠ ✁ ✔ ✁ ✑ ✙ � ✓ ✜ � � ✄ � ✔ ✙ ✒ ✛ ✜ ✠ ✠ ✄ ✓ ✓ ✜ ☛ ✝ ✔ � ✁ ✂ ✂ ✁ ✁ ✠ ✓ ✂ ✙ ✒ ✛ ✜ ✠ ✄ ✄ ✔ ☎ ☛ � ✁ ✂ ✛ � � ✙ ✂ ✓ ✜ � ✔ ✝ ✁ ✝ ✝ ✛ � ✜ ☛ ✝ ✁ ✂ ✛ ✂ ✛ ✛ ✁ � ✁ ✄ ✂ ✝ � ✁ ✁ ✄ � ✁ ✄ ☎ ☛ ✑ ✝ ✓ ✙ ✛ ✝ ✌ ✁ ✁ ✑ � ✄ ☎ ✠ ✁ � ✠ ✄ ✁ ✁ ✜ ✂ ✁ ✁ � � ✙ ✑ � ✁ ✔ ✄ � ✁ � ✄ Better data types, better ☞✂✁ where where let ☞✂✁ ☞✂✁ data data
An Introduction to Type Theory – p.9/32 ✄ ✝ ✁ ✂ ✝ ✛ � ✛ ✁ � � ✝ ✁ � ✛ ✄ ✁ � ✙ ✂ ✑ ✛ ✜ ✠ ✠ ✄ ✁ ✁ ✙ ✑ � ✓ ✜ � ✔ � ✁ ✁ ✓ ✙ � ✁ ✔ ✓ ✜ ☛ ✝ ✔ � ✛ ✠ ✄ ✁ ✠ ✄ ✝ ✛ ✄ ✁ ✠ ✄ ✜ ✒ � ✛ ✜ ✠ ✠ ✄ ✔ ☎ ☛ ✁ ✛ ✠ ✛ ✄ ✁ ✓ ✂ ✙ ✒ ✒ ✙ ✂ ✛ ✜ � ✔ ✝ ✁ ✂ ✝ � ✛ ✜ ☛ ✝ ✁ ✂ ✝ � ✓ ✝ ✜ � ✁ � ✁ ✄ ✂ ✝ ✛ ✁ ✂ ✄ � ✁ ✄ ☎ ☛ ✁ ✓ ✛ � ✂ � ✁ ✠ ☎ � ✙ ✁ ✑ ✁ ✁ ✔ ✌ ✝ ✛ ✄ ✁ ✙ � � ✁ ✄ � ✁ ✄ ✁ ✑ ✁ ✑ ✙ � � ✠ ✄ Better data types, better ☞✂✁ where where let is a total function. ☞✂✁ ☞✂✁ data data
An Introduction to Type Theory – p.9/32 � � ✛ ✄ ✁ � ✝ ✁ ✛ ✝ ✄ ✁ ✓ ✂ ✙ ✒ ✛ ✜ ✛ ✂ ✠ ✄ � ✄ ✁ ✁ ✑ ✙ � ✓ ✜ ✔ ✁ � ✁ ✁ ✑ ✙ � � ✝ ✠ ✔ ✠ ✁ ✁ ✛ ✄ ✁ ✠ ✄ ✝ ✛ ✄ ✛ ✔ ✄ ✁ � ✁ ✂ ✄ ☎ ✆ � ✝ ☎ ✂ ☛ � ✁ ✠ ✛ ✄ ✁ ✓ ✙ ☛ ✒ ✛ ✜ ✠ ✠ ✄ ✔ ✓ ✜ � ✠ ✜ � � ✔ ✝ ✁ ✂ ✝ ✛ ✜ ✓ ☛ ✝ ✁ ✂ ✝ ✛ ✓ ✛ ✜ ✛ ✔ � ✁ � ✁ ✄ ✂ ✝ ✛ ✁ ✝ ✄ � ✁ ✄ ☎ ☛ ✁ ✂ � ✜ ✙ ✁ ✁ ✑ � � ☎ ✠ ✂ ✌ � � ✠ ✄ ✁ ✁ ✑ ✁ ✝ ✙ ✙ ✁ ✄ � ✁ ✒ ✄ ✁ ✛ ✑ ✙ � � ✁ ✄ ✂ � Better data types, better ☞✂✁ where is not well-typed. where let is a total function. ☞✂✁ ☞✂✁ data data
Verify An Introduction to Type Theory – p.10/32
� ✁ ✂ Verify How can we use on lists of unknown length user input,. . . ? An Introduction to Type Theory – p.10/32
✞ � � ✆ ✄ ✂ ☎ ✄ � ✡ ✄ ✂ ✞ ✁ ✁ ✝ ✁ ✂ ☛ ✄ � ✄ ✡ � ✡ ✆ ✂ ✁ � � Verify How can we use on lists of unknown length user input,. . . ? let An Introduction to Type Theory – p.10/32
✄ ✝ � ☎ ✂ ✄ ✆ � � ✞ ✡ � ✡ ✆ ✁ � ✁ ✞ ✂ � ✄ ✡ ✄ � ✁ ✂ ✍ ✌ ☞ ✡ � ✂ ✄ ☛ ✂ ✁ ✁ � ✁ ✞ ✄ Verify How can we use on lists of unknown length user input,. . . ? let An Introduction to Type Theory – p.10/32
✝ � � ✞ � ✡ ✆ ✁ � ✁ ✞ ✂ ✄ � � ☞ ✌ ✍ ✁ � ✁ ✞ ✂ ✄ � ✟ � ✆ ✆ ✂ � ✁ ✂ ✍ ✌ ☞ ✡ ✄ � ✄ ☛ ✁ ✄ ✁ � ✁ ✞ ✂ ✄ ✡ � ✄ ☎ ✂ ✡ Verify How can we use on lists of unknown length user input,. . . ? let An Introduction to Type Theory – p.10/32
✡ � � ✆ ✁ � ✁ ✞ ✂ ✄ � � ☞ ✌ ✂ ✞ ✁ ✂ ✞ � � ✁ � ✁ ✞ ✂ ✄ � ✟ � ✝ ✆ ✁ � ✁ ✂ ✍ ✌ ☞ ✡ ✄ � ✄ ☛ ✂ ✁ � � ✁ ✞ ✂ ✄ ✡ � ✄ ☎ ✂ ✄ ✆ � ✡ Verify How can we use on lists of unknown length user input,. . . ? let An Introduction to Type Theory – p.10/32
� � ✂ ✞ ✁ � ✁ � ✞ � ✂ ✁ ✂ � ✌ ☞ ✆ ✄ ✟ ✄ ✞ � ✆ ✡ ✟ � ✄ ✂ ✁ ✡ � ✁ ✍ ✌ ☞ � ✆ � ✂ � � ✁ � ✁ ✁ ✂ ☛ ✄ ✄ ✂ ✡ ☞ ✌ ✍ ✂ ✁ � ✞ ✄ ✞ ✝ ✁ � ✁ ✆ ✡ � ✞ � ✡ � ✆ ✄ ✂ ☎ ✄ � ✟ Verify How can we use on lists of unknown length user input,. . . ? let An Introduction to Type Theory – p.10/32
✌ � ✡ ✟ � ✄ ✂ ✞ ✁ ✁ � � � ✞ ✂ ✁ ✂ � ✆ ✆ ☞ � ✞ � ✆ ✡ ✟ � ✄ ✂ ✁ ✌ � ✁ ✂ � ✁ ✟ ✁ � ☞ � � ✄ ✞ ✁ � ✁ ✁ ✂ ☛ � ✄ ✄ ✡ ☞ ✌ ✍ ✂ ✁ � ✂ ✡ ✄ � ✂ ✞ ✁ � ✁ ✆ ✡ ✞ � ✝ � � ✆ ✄ ✂ ☎ ✄ ✟ Verify How can we use on lists of unknown length user input,. . . ? let An Introduction to Type Theory – p.10/32
An Introduction to Type Theory – p.10/32 � ✁ ✂ � ✁ ✟ ✁ � ✌ ☞ ✆ ✁ ✡ ✟ � ✄ ✂ ✞ ✁ � ✁ � ✞ � � ✍ ✌ ☞ � ✡ ✄ ✂ ✞ ✁ ✁ ✂ � ✆ � ✟ � ✆ ✡ ✟ � ✄ � ✞ ✂ � ☎ ✄ � ✡ ✄ ✂ ✞ ✁ ✁ ✄ ✁ ✂ ☛ ✄ � ✄ ✡ � ✁ ✂ ✆ ✂ ✂ ✁ ✂ � ✌ ☞ � � ✄ ✞ � ✁ � ✁ ✆ ✡ � ✞ ✝ � on lists of unknown length Verify How can we use user input,. . . ? let
An Introduction to Type Theory – p.10/32 ✁ ✆ � ✟ � ✆ ✡ ✟ � ✄ ✂ ✞ � ✁ ✁ ✂ � ✁ ✟ ✁ � ✌ ☞ � ✆ ✡ � � � ☞ ✍ ✌ ☞ � ✁ ✟ ✁ � � ✍ ✌ � ✁ � ✞ ✂ ✁ ✂ � � � ✡ ✄ ✂ ✞ ✟ ✄ � ✞ � ✆ ✄ ✂ ☎ ✄ � ✡ ✄ ✂ ✁ ✝ � ✁ ✁ ✂ ☛ ✄ � ✄ ✡ � ✁ ✂ ✞ ✂ � ✞ ✁ � ✁ � � ✞ ✂ ✁ ✂ ✌ � ☞ � � ✄ ✂ ✞ ✁ � ✁ ✆ ✡ on lists of unknown length Verify How can we use user input,. . . ? let
An Introduction to Type Theory – p.10/32 ✄ ✁ � ✁ � ✆ � ✟ � ✆ ✡ ✟ � ✂ ✂ ✞ ✁ � ✁ ✂ � ✁ ✟ ✁ � ✌ ☞ ✞ ✄ ✆ ✂ ✍ ✌ ☞ � ✁ ✟ ✁ � � � � ✞ ✁ ✡ ✂ � ✌ ☞ � � ✞ ✂ ✁ ✂ � � � � ✡ ✝ ✞ � � ✆ ✄ ✂ ☎ ✄ � ✡ ✄ ✂ ✁ ✞ � ✁ ✁ ✂ ☛ ✄ � ✄ ✡ � ✁ ✟ � ✂ ✁ � ✄ ✂ ✞ ✁ � ✁ � � ✞ ✂ ✂ ✡ � ✌ ☞ � � ✄ ✂ ✞ ✁ � ✁ ✆ on lists of unknown length Verify How can we use user input,. . . ? let
An Introduction to Type Theory – p.10/32 � � � ✡ ✄ ✂ ✞ ✁ � ✁ � ✆ � ✟ ✆ ✂ ✡ ✟ � ✄ ✂ ✞ ✁ � ✁ ✂ � ✁ ✟ � ✁ � ✟ ✆ � ✂ ✟ � ✁ ✟ ✁ � ✌ ☞ � ✁ ✁ ✂ � � � � ✞ ✂ ✁ ✂ � ✌ ☞ � � ✞ ✁ ✌ � ✂ ✞ ✝ � � ✆ ✄ ✂ ☎ ✄ � ✡ ✄ ✞ ✡ ✁ � ✁ ✁ ✂ ☛ ✄ � ✄ ✡ � ✁ ☞ ✆ ✂ � � ✆ ✡ ✟ � ✄ ✂ ✞ ✁ � ✁ � ✞ ✁ ✂ ✁ ✂ � ✌ ☞ � � ✄ ✂ ✞ ✁ � on lists of unknown length Verify How can we use user input,. . . ? let
Going further An Introduction to Type Theory – p.11/32
✁ � ✁ ✞ ✂ ✄ Going further The type of is not informative enough for some of its potential applications. An Introduction to Type Theory – p.11/32
✁ � ✁ � ✁ ✁ � ✄ ✟ ✁ ✡ ✂ � � ✄ ✂ ✞ ✁ � ✁ ✞ Going further The type of is not informative enough for some of its potential applications. How is related to ? An Introduction to Type Theory – p.11/32
✄ � ✞ ✁ � ✁ � ✂ � ✁ � ✡ ✂ ✂ ✞ ✁ ✁ ✄ � ✁ � ✁ ✞ ✂ ✄ � ✁ ✞ � ✁ ✟ ✁ � ✂ Going further The type of is not informative enough for some of its potential applications. How is related to ? When does return ? An Introduction to Type Theory – p.11/32
� ✝ ✁ ☎ ✂ ✁ ✌ ✓ ✜ ☛ ✔ ☛ � ✁ ✜ ✓ ✂ ✁ ✌ ✝ ✔ � ☎ ✁ ✌ ✂ ✄ ✝ ✁ ✂ ✝ ✛ � ✂ ✁ ✌ ✝ ✁ ✄ ✂ ✁ improved. let ☞✂✁ An Introduction to Type Theory – p.12/32
An Introduction to Type Theory – p.12/32 ✛ ✓ � ✁ ✛ ✗ ✒ � ✁ ✝ � ✁ ✗ ✁ ✒ ✂ � ✛ ✝ ✂ ✁ ✝ ✄ ✁ ✝ ✂ ✌ ✁ ✁ ✔ ✝ ✆ � ✓ � ✁ ✛ ✗ ✒ � ✝ ✝ � � ✒ ✒ ✄ ✄ ✁ � ✄ ✝ ✔ � � ✛ ✝ ☎ ✁ � ☛ ☎ ✌ ✁ ✂ ✄ ✁ ✌ ✁ ✁ ✂ � ✛ ✝ ✂ ✁ ✝ ✄ ✂ ✗ ✂ ✌ ✌ ✒ � ✄ ✁ ✝ ✄ � ✔ ✝ ✓ ✁ ✔ ✝ ✂ ✓ ✜ ✜ ✁ � ✁ ☛ ☞✂✁ ✝ ☎✄ improved. ☞✂✁ where let ☞✂✁ data
An Introduction to Type Theory – p.12/32 ✌ ✝ � � ✒ ✒ ✄ ✄ ✁ � ✄ ✝ ✔ ✝ ✁ � ✂ ✓ � ✁ ✛ ✗ ✒ � ✁ ✝ � ✁ ✛ ✗ ✁ ✒ ✂ ☎ ✝ � ✁ ✛ ✗ ✒ � ✁ ✝ � ✁ � ✝ ✑ ✗ ✂ ✄ ✁ ✝ ✄ � ✔ ✝ ✆ � ✓ � ✁ ✛ ✁ � � ✁ ✛ ☛ ✜ ✓ ✌ ✁ ✂ ☎ ✁ � ☛ ☎ ✌ ✂ � ✄ ✁ ✝ ✌ ✁ ✂ � ✛ ✝ ✂ ✁ ✝ ✄ ✂ ✔ ✝ ✁ ✄ ✝ ✂ ✁ ✝ ✄ ✁ ✝ � ✁ ✛ ✗ ✒ � ✒ ✔ ✁ ✜ ✓ ✝ ✄ � ✂ ✁ ✝ ✌ ☞✂✁ ✝ ☎✄ improved. ☞✂✁ ☞✂✁ let where let ☞✂✁ data
An Introduction to Type Theory – p.12/32 ✁ ✄ ✒ ✒ � � ✝ � ✁ ✒ ✗ ✛ ✁ � ✓ ✄ � ✆ � ✁ � ✒ ✗ ✛ ✁ ✓ ✄ ✂ ✁ ✌ ✝ ✔ ✝ � ✝ � ✝ ✁ � ✝ ✂ ✑ ☎ � ✗ ✁ � ✝ � ✁ ✂ ✛ ✒ ✔ ✑ � ✄ ✝ ✁ ✄ ✂ ☎ � ✝ � ✁ � ✝ ✁ ✁ � ✁ ✌ � ✔ ✝ ☛ ✜ ✓ ✌ ✁ ✂ ☎ ✁ � ☛ ☎ ✁ ✜ ✛ ✂ ✄ ✝ ✁ ✂ ✝ � ✂ ✂ ✁ ✌ ✝ ✁ ✄ ✛ ✁ ✓ ✝ ✛ ✁ � ✝ ✁ ✄ ✁ ✒ ✂ ✝ ✛ � ✂ ✒ ✗ ✂ ✗ ✝ � ✁ ✌ ✝ ✔ � ✄ ✝ ✁ ✄ ☞✂✁ ✝ ☎✄ improved. ☞✂✁ ☞✂✁ let where let ☞✂✁ data
An Introduction to Type Theory – p.12/32 ✆ ✗ ✛ ✁ � ✓ � ✝ � ✔ � ✄ ✝ ✁ ✄ ✂ ✒ ✁ ☎ ✄ ✓ ✂ ✁ ✌ ✝ ✔ ✝ � ✝ ✁ ✄ ✄ ✒ ✒ � � ✑ ✝ ✁ ✁ ✁ ✂ ✂ ✑ ☎ ✝ � ✓ ✝ ✜ � ✔ ✝ � ✁ ✂ � ☎ � ✛ ✁ � ✝ ✁ � ✒ ✗ ✁ ✁ � ✝ ✂ ✑ ☎ ✝ � ✁ � ✛ ☛ ✁ ☎ ✂ ✁ ✌ ✓ ✜ ✝ ☛ ✔ � ✁ ✜ ✓ ✂ ✁ � ☎ ✝ � ✂ ✄ ✝ ✁ ✂ ✝ ✛ ✂ ✌ ✁ ✌ ✝ ✁ ✄ ✂ ✁ ✗ ✌ ✔ ✒ ✁ ✂ ✝ ✛ � ✂ ✗ ✄ ✛ ✁ � ✝ ✁ � ✒ ✝ � ✁ ✁ � � ✁ ✛ ✄ ✗ ✒ � ✝ ✄ ✝ ☞✂✁ ✝ ☎✄ improved. ☞✂✁ ☞✂✁ let where let ☞✂✁ data
An Introduction to Type Theory – p.12/32 ✄ � ✓ � ✆ ✝ ✔ � ✝ ✛ ✁ ✄ ✂ ✑ ☎ ✝ � ✁ ✗ � ✄ ✌ ✝ ✔ ✝ ✄ � ✁ ✄ ✒ ✒ ✒ � � ✝ ✁ � ✁ ✝ ✂ ✁ ☎ ✝ ✂ ✑ ☎ ✝ � ✓ ✒ ✜ � ✔ ✝ � ✁ ✂ � ✒ ✁ ✂ � ✒ ✗ ✛ ✁ � ✝ ✑ ✄ ☎ ✝ � ✁ ☎ ✝ � ✁ ✁ � ✓ ✝ ☎ ✂ ✁ ✌ ✓ ✜ ☛ ✔ � � ✁ ✜ ✓ ✂ ✁ ✌ ✁ ☛ ✔ � ✂ ✄ ✝ ✁ ✂ ✝ ✛ ✂ ☎ ✁ ✌ ✝ ✁ ✄ ✂ ✁ ✌ � ✝ ✁ ✁ � ✛ � ✂ ✒ ✗ ✛ � ✁ ✝ ✁ � ✒ ✗ ✛ ✁ ✂ ✝ ✝ ✛ ✝ ✄ ✄ � ✄ ✒ ✗ � ✁ ✝ ✁ ✁ ☞✂✁ ✝ ☎✄ improved. ☞✂✁ ✝ ☎✄ ☞✂✁ let where let ☞✂✁ data
An Introduction to Type Theory – p.12/32 ✁ ✂ ✑ ☎ ✝ � ✁ � ✝ � ✁ ✒ ✗ ✛ ✁ � ✝ ✂ ✑ ✄ ✝ ✝ ✒ ✄ ✒ ✒ � � ✝ ✁ � ✗ ✄ ✛ ✁ � ✓ � ✆ ✝ ✔ � ☎ � ✁ ✜ ✂ ✂ ✑ ☎ ✝ � ✁ ✓ � � ✔ ✓ ✜ ✝ ✔ � ✁ ✂ ✁ ☎ ✁ ☎ ☎ ✝ � ✁ ✄ ✒ ✒ � ✝ ✔ ✂ ✑ ☎ ✝ � ✁ ✓ ✜ � ✁ � � � ✂ ✁ ✌ ✓ ✜ ☛ ✝ ✔ ✁ ✁ ✜ ✓ ✂ ✁ ✌ ✝ ✔ � ☎ � ✁ ✂ ✂ ✄ ✝ ✁ ✂ ✝ ✛ � ✁ ☛ ✌ ✝ ✁ ✄ ✂ ✁ ✌ ☎ ✝ ✄ ✄ ✒ ✄ ✛ ✁ � ✝ ✁ � ✗ ✒ ✛ ✁ � ✓ ✂ ✁ ✌ ✝ ✗ ✂ � ✝ ✄ � ✝ ✒ ✗ ✛ ✁ � ✔ ✁ ✄ ✝ ✁ ✂ ✝ ✛ ☞✂✁ ✝ ☎✄ improved. ☞✂✁ ✝ ☎✄ ☞✂✁ let where let ☞✂✁ data
An Introduction to Type Theory – p.12/32 ✛ � ✁ � ✝ ✁ � ✒ ✗ ✁ ☎ � ✝ ✂ ✑ ☎ ✝ � ✁ ☎ ✝ ✑ � � � � ✝ ✁ � ✒ ✗ ✛ ✁ ✓ ✂ � ✆ ✝ ✔ � ✄ ✝ ✁ ✄ ✝ ✁ ✒ ✓ ☎ ☛ ✂ ✑ ☎ ✝ � ✁ ✜ ✁ � ✔ ✓ ✜ ✝ ✔ � ✁ ✂ � ✛ ✄ � ✒ ✒ � ☎ ✝ ✂ ✑ ☎ ✝ ✁ ✗ ✓ ✜ � ✔ ☎ � ✁ ✂ ✒ ✁ � ✄ ✁ ✁ ✌ ✓ ✜ ☛ ✝ ✔ � ✜ ☎ ✓ ✂ ✁ ✌ ✝ ✔ � ✄ ✝ ✂ ✁ ✄ ✂ ✂ ✄ ✝ ✁ ✂ ✝ ✛ � ✁ � ✌ ✝ ✁ ✄ ✂ ✁ ✌ ☎ ☛ ✄ ✁ ✒ ✛ � ✝ ✁ � ✒ ✁ ✗ ✁ ✛ � � ✓ ✂ ✁ ✌ ✝ ✔ ✁ ✗ ✄ ✒ � ✒ ✗ ✛ ✁ � ✝ ✁ ✄ ✝ ✁ ✂ ✝ ✛ � ✂ ✝ ☞✂✁ ✝ ☎✄ improved. ☞✂✁ ✝ ☎✄ ☞✂✁ let where let ☞✂✁ data
An Introduction to Type Theory – p.12/32 ☎ � ✒ ✗ ✛ ✁ � ✝ ✂ ✑ ✝ ✝ � ✁ ☎ ✝ � ✁ ✄ ✒ ✒ ✁ � ☎ ✝ � ✒ ✗ ✛ ✁ � ✓ � ✆ ✔ ✁ � ✄ ✝ ✁ ✄ ✂ ✑ ☎ ✝ � � ✝ ✝ � ✁ ✓ ✜ � ✔ ✓ ✜ ✝ ✔ ✂ ✝ ✑ ☎ ✝ � ✁ � ✝ � ✁ ✂ � ☎ ✂ ☎ ✑ ☎ ✝ � ✁ ✓ ✜ � ✔ � ✑ ✁ ✂ ✒ ✗ ✛ ✁ � ☎ ☛ ✂ ✁ � � ✜ ✌ ✓ ✜ ☛ ✝ ✔ � ✁ ✓ ✂ ✂ ✁ ✌ ✝ ✔ � ✄ ✝ ✁ ✁ ☎ � ✁ ✂ ✄ ✝ ✁ ✂ ✝ ✛ � ✂ ✌ ✁ ✝ ✁ ✄ ✂ ✁ ✌ ☎ ☛ � ✄ ✁ ✒ ✝ ✗ ✗ ✛ ✁ � ✓ ✂ ✁ ✌ ✔ ✁ ✝ ✄ � ✁ ✄ ✄ ✒ ✒ � � ✒ ✝ ✛ � ✝ ✁ ✄ � ✝ ✁ ✂ ✝ ✛ � ✂ ✒ ✗ ✛ ✁ ✁ ☞✂✁ ✝ ☎✄ improved. ☞✂✁ ✝ ☎✄ ☞✂✁ let where let ☞✂✁ data
An Introduction to Type Theory – p.12/32 ✂ ✔ ☎ � ✁ ✂ ✒ ✗ ✛ ✁ � ☎ ☛ ✑ ✜ ☎ ✝ � ✁ ✓ ✜ � ✔ ✓ ✜ ✝ ✔ � � ✓ ✑ ☎ � ✒ ✗ ✛ ✁ � ✝ ✂ ✑ ☎ ✝ � ✁ ✝ ✁ � ✁ ✄ ✒ ✒ � ☎ ✝ ✂ ✑ ☎ ✝ � ✂ ☎ ✁ ✁ ✂ ✑ ☎ ✝ � ✁ ✓ ✜ � ✔ ✓ ✂ ✌ ✁ ✝ ✔ ✕ ✂ ✒ ✗ ✛ ✁ � ✝ � ✁ ✂ ✂ � ✝ ✔ � ✁ � ✝ ✂ ✑ ☎ ✝ � ✁ ✓ ✜ � ✓ ✝ ✜ ✓ � ✆ ✝ ✔ ✔ ✕ ✄ ✒ ✒ � � ✁ � � ✁ � ✁ ✜ ✓ ✂ ✁ ✌ ✝ ✔ � ✄ ✝ ✄ ✝ � ✒ ✗ ✛ ✁ � ✝ ✁ ✄ ✝ ✁ ✁ ✔ ☛ ✛ ✁ ✂ ✄ ✝ ✁ ✂ ✝ ✛ � ✂ ✁ ✌ ✝ ✄ ✜ ✂ ✁ ✌ ☎ ☛ � ✁ ☎ ✂ ✁ ✌ ✓ ✝ ✂ � � ✂ � � ✝ ✁ � ✒ ✗ ✛ ✁ � ✓ ✆ ✒ ✝ ✔ � ✄ ✝ ✁ ✄ ✂ ✑ ☎ ✝ � ✒ ✝ ✄ ✓ ✒ ✗ ✛ ✁ � ✝ ✁ � ✒ ✗ ✛ ✁ ✄ � ✔ ✂ ✁ ✌ ✁ ✝ � ✝ ✄ ☞✂✁ ✝ ☎✄ improved. ☞✂✁ ✝ ☎✄ ✝ ☎✄ ☞✂✁ let where let ☞✂✁ data
An Introduction to Type Theory – p.12/32 ✓ ✒ ✗ ✛ ✁ � ☎ ☛ ✂ ✑ ☎ ✝ � ✁ ✜ ✁ � ✔ ✓ ✜ ✝ ✔ � ✂ ✑ ☎ ✝ � ✁ ✂ � ✝ ✄ ✁ � ✝ ✂ ✑ ☎ ✝ � ✁ ☎ ✝ � ✁ ✒ ☎ ✒ � ☎ ✝ ✂ ✑ ☎ ✝ � ✁ ✓ ✜ � ✔ � ✂ ✗ ✁ ✝ ✂ ✑ ☎ ✝ � ✁ ✓ ✜ � ✔ ✓ ✂ ✌ � ✝ ✔ ✕ ✂ ✒ ✗ ✛ ✁ � ✝ � ✁ ✂ ✔ ✜ ✑ ✝ ☎ ✝ � ✁ ✓ ✜ � ✔ ✓ ✜ ✓ � ✆ ✔ ✓ ✔ ✕ ✄ ✒ ✒ � � ✝ � ✁ ✄ ✒ ✒ � ✁ � ✒ ✄ ✁ ✜ ✓ ✂ ✁ ✌ ✝ ✔ � ✄ ✝ ✁ � ✔ ✒ ✗ ✛ ✁ � ✝ ✁ ✄ ✝ ✁ ✂ � ✛ � ✝ ✂ ✁ ✂ ✄ ✝ ✁ ✂ ✝ ✛ � ✂ ✁ ✌ ✝ ✄ ☛ ✂ ✁ ✌ ☎ ☛ � ✁ ☎ ✂ ✁ ✌ ✓ ✜ � ✝ ✒ ✔ ✗ ✁ � ✒ ✗ ✛ ✁ � ✓ � ✆ ✝ � � ✄ ✝ ✁ ✄ ✂ ✑ ☎ ✝ � ✁ � ✝ ✁ � ✝ ✒ ✗ ✁ ✂ ✓ � ✁ ✛ ✒ ✌ � ✁ ✝ � ✁ ✛ ✒ ✛ ✝ ✔ ✝ ✄ � ✄ ✁ ✄ ☞✂✁ ✝ ☎✄ ✝ ☎✄ improved. ☞✂✁ ✝ ☎✄ ✝ ☎✄ ☞✂✁ let where let ☞✂✁ data
An Introduction to Type Theory – p.12/32 ✂ ✑ ☎ ✝ � ✁ ✓ ✜ � ✔ ✓ ✜ ✝ ✔ � ✑ ☛ ☎ ✝ � ✁ � ✝ ✂ ✑ ☎ ✝ � ✁ ✓ ✜ ✂ ☎ ✔ ☎ � ✁ ☎ ✝ � ✁ ✄ ✒ ✒ � ☎ ✝ ✂ ✑ ✝ � � ✁ ✓ ✜ � ✔ ☎ � ✁ ✂ ✒ ✗ ✛ ✁ � ✓ ✁ � ✓ ✂ ✁ ✌ ✝ ✔ ✕ ✂ ✒ ✗ ✛ ✁ � ✝ ✁ � ✂ ✒ ✗ ✛ ✁ ✓ ✜ � ✔ ✓ ✜ ☛ ✝ ✔ ✔ ✜ ✜ ✁ ✓ � ✆ ✝ ✔ ✔ ✕ ✄ ✒ ✒ � � ✝ � ✄ ✓ ✒ ✒ � ✓ ✜ � ✔ ✝ ✂ ✑ ☎ ✝ � ✁ ✝ � ✑ ✗ ✓ ✂ ✁ ✌ ✝ ✔ � ✄ ✝ ✁ ✄ � ✒ ✛ ✁ ✁ � ✝ ✁ ✄ ✝ ✁ ✂ ✝ ✛ � ✂ ✂ ✗ ✜ � ✁ ✄ ✂ ✄ ✝ ✁ ✂ ✝ ✛ � ✂ ✁ ✌ ✝ ✁ ✂ ✔ ✁ ✌ ☎ ☛ � ✁ ☎ ✂ ✁ ✌ ✓ ✜ ☛ ✝ ✛ ✒ � ✂ ✝ ✛ ✁ � ✓ � ✆ ✝ ✔ � ✄ ✝ ✁ ✄ ✑ � ☎ ✝ � ✁ � ✝ ✁ � ✒ ✗ ✛ ✁ � ✝ ✒ ✗ ✁ ✝ ✁ � ✒ ✗ ✛ ✁ � ✓ ✂ ✁ ✌ ✝ ✔ ✝ ✄ � ✄ � � ✒ ✒ ✄ ☎ ✁ ☞✂✁ ✝ ☎✄ ✝ ☎✄ improved. ☞✂✁ ✝ ☎✄ ✝ ☎✄ ☞✂✁ let where let ☞✂✁ data
Definitional equality An Introduction to Type Theory – p.13/32
� ✡ � ✟ ✁ ✡ � ✆ ✁ ✟ ✡ ✁ � ✡ � � ✆ ✄ ✂ ✞ ✁ � ✁ ✁ Definitional equality The typing of depends on the equations: An Introduction to Type Theory – p.13/32
� ✡ � ✟ ✁ ✡ � ✆ ✁ ✟ ✡ ✁ � ✡ � � ✆ ✄ ✂ ✞ ✁ � ✁ ✁ Definitional equality The typing of depends on the equations: This equations need to be true definitionally . An Introduction to Type Theory – p.13/32
� ✟ � ✆ ✡ � ✁ � ✟ ✁ ✡ � ✆ ✁ � ✡ ✡ ✁ ✡ � � ✡ ✄ ✂ ✞ ✁ � ✁ � Definitional equality The typing of depends on the equations: This equations need to be true definitionally . If we need we have to use propositional equality. An Introduction to Type Theory – p.13/32
Propositional equality An Introduction to Type Theory – p.14/32
✄ � ✄ ✁ � ✁ ✂ ✄ ✄ ☎ � � ✄ ✄ ✄ ✂ ✄ � ✄ ✄ ☎ ✄ ✂ ✄ Propositional equality data where An Introduction to Type Theory – p.14/32
An Introduction to Type Theory – p.14/32 � � ✆ ✡ ✟ � ☎ � ✂ � � ✁ � ✁ ✌ ☞ � ☎ ✡ � � � ✁ � ✁ ✌ ☞ ✁ � ✁ ✡ � � ✡ ☎ � � ✂ � ✁ � ✂ ✄ ☎ ✁ � ✁ ✂ ✄ ✄ ✄ ✄ � � ✄ ☎ ✂ ✄ � ✡ ✄ ✄ � � � � ✡ ✄ ✡ ✂ ✂ � ✁ ✂ ☛ ✄ ✡ ✄ ✄ ✄ Propositional equality where data �✂✁ let
An Introduction to Type Theory – p.14/32 ✌ ✌ ✂ ✄ ✁ � � ✄ ✄ � ✁ � ✁ ☞ ✂ ✁ � ✁ � ✡ � ✡ ☎ � � ✂ � ✁ ☎ ✄ � ✆ ✂ ✌ ☞ ✂ ✁ ✆ ✄ ✁ � ✁ � ✁ ✟ ✁ ✁ ✟ � ✁ ✄ ✂ ✁ � ✁ ✟ ✆ ✁ ✟ ✄ � � ✡ ✄ ☛ ✄ ✡ ✄ � ✄ ✄ ✄ ✁ � ✁ ✂ ✄ ✁ ☎ ✄ � � ✄ ✂ ✄ � ✄ ✄ ☎ ✄ ✂ ✂ ✂ � ✌ � ✆ ✡ ✟ � ☎ � � ✂ � ✁ � ✁ ☞ � � ✡ ✄ ✡ � � ✡ ✂ � � ☎ Propositional equality where data �✂✁ let let
� Problems with An Introduction to Type Theory – p.15/32
� Problems with Programs cluttered with coercions. An Introduction to Type Theory – p.15/32
� Problems with Programs cluttered with coercions. Programming requires theorem proving. An Introduction to Type Theory – p.15/32
✄ ☎ ✝ � ✂ ✁ � ✂ � ✆ ✂ � ✂ ✄ ✄ ✄ ✂ ✌ ✂ ✄ ✁ ✄ � ✄ � � ✁ ✁ Problems with Programs cluttered with coercions. Programming requires theorem proving. Equality on functions is not extensional, i.e. let cannot be derived. An Introduction to Type Theory – p.15/32
Solutions ? An Introduction to Type Theory – p.16/32
Recommend
More recommend