EoPL reading (126) 2.3 Representation Strategies for Data Types
待ち時間で整理してみる事に。
まず unify-term の仕様 (というか実装) から。
- t が var-term の場合
- u が var-term 又は u に含まれる id に tid が無い場合は unit-subst 手続きに tid と u を渡した結果を戻す
- 上記の条件に合致しない場合、#f を戻す
- t が var-term 以外の場合 (constant-term 又は app-term の場合)
- u が var-term の場合 unify-term に u と t を渡してその戻りを戻す
- u が constant-term の場合
- t が app-term なら #f を戻す
- t が constant-term で、値が同一であれば (empty-subst-rec) を戻す
- t が constant-term で、値が同一でなければ #f を戻す
- u が app-term の場合
- t が constant-term なら #f を戻す
- t が app-term なら unify-terms に ts と us を渡してその戻りを戻す
ええと、明かに #f が戻るパターンとしては
- その1
(unify-term '(var-term x) '(app-term ((var-term x))))
- その2
(unify-term '(constant-term 1) '(app-term ((var-term x))))
- その3
(unify-term '(constant-term 1) '(constant-term 2))
- その4
(unify-term '(app-term ((var-term x))) '(constant-term 1))
単純ではないけど、以下もダメかな。
- その5
(unify-term '(app-term ((var-term x))) '(var-term x))
試験追加してみた。パスしてます。
(test-section "unify-term (2)") (test* "(unify-term '(var-term x) '(app-term ((var-term x))))" #f (unify-term '(var-term x) '(app-term ((var-term x))))) (test* "(unify-term '(constant-term 1) '(app-term ((var-term x))))" #f (unify-term '(constant-term 1) '(app-term ((var-term x))))) (test* "(unify-term '(constant-term 1) '(constant-term 2))" #f (unify-term '(constant-term 1) '(constant-term 2))) (test* "(unify-term '(app-term ((var-term x))) '(constant-term 1))" #f (unify-term '(app-term ((var-term x))) '(constant-term 1))) (test* "(unify-term '(app-term ((var-term x))) '(var-term x))" #f (unify-term '(app-term ((var-term x))) '(var-term x)))
そろそろ移動します。