▲❡t✬s ❯♥✐❢② ❲✐t❤ ❙❝❛❧❛ P❛tt❡r♥ ▼❛t❝❤✐♥❣✦ ❊❞♠✉♥❞ ▲❛♠ ■❧✐❛♥♦ ❈❡r✈❡s❛t♦ s❧❧❛♠❅q❛t❛r✳❝♠✉✳❡❞✉ ✐❧✐❛♥♦❅❝♠✉✳❡❞✉ ❈❛r♥❡❣✐❡ ▼❡❧❧♦♥ ❯♥✐✈❡rs✐t②✱ ◗❛t❛r ❈❛♠♣✉s ❙✉♣♣♦rt❡❞ ❜② ◗◆❘❋ ❣r❛♥t ❏❙❘❊P ✹✲✵✵✸✲✷✲✵✵✶ ❛♥❞ ◆P❘P ✹✲✸✹✶✲✶✲✵✺✾ ✷✻ ❏✉♥❡ ✷✵✶✻ ✶✴✶✽
❇✉t ✳ ✳ ✳ ♥♦ ❧♦✈❡ ❢♦r ✉♥✐✜❝❛t✐♦♥ ✳ ✳ ✳ ❂✭ ◆♦ ❜✉✐❧t✲✐♥ s✉♣♣♦rt ◆♦ ♦✣❝✐❛❧ ❧✐❜r❛r✐❡s ❙❝❛❧❛✱ ❛ ▼♦❞❡r♥✱ ●❡♥❡r❛❧✲P✉r♣♦s❡✱ Pr♦❣r❛♠♠✐♥❣ ▲❛♥❣✉❛❣❡ ❚♦♥s ♦❢ ♠♦❞❡r♥ ❢❡❛t✉r❡s✿ ❖❜❥❡❝t✲♦r✐❡♥t❡❞ ♣r♦❣r❛♠♠✐♥❣ ❋✉♥❝t✐♦♥❛❧ ♣r♦❣r❛♠♠✐♥❣ ❆❧❣❡❜r❛✐❝ ❞❛t❛ t②♣❡s ❊①t❡♥s✐❜❧❡ ♣❛tt❡r♥ ♠❛t❝❤✐♥❣ ❚②♣❡ ✐♥❢❡r❡♥❝❡ ▲❛③② ❡✈❛❧✉❛t✐♦♥ ❚❤❡ ❧✐st ❣♦❡s ♦♥ ✳ ✳ ✳ ✷✴✶✽
❙❝❛❧❛✱ ❛ ▼♦❞❡r♥✱ ●❡♥❡r❛❧✲P✉r♣♦s❡✱ Pr♦❣r❛♠♠✐♥❣ ▲❛♥❣✉❛❣❡ ❚♦♥s ♦❢ ♠♦❞❡r♥ ❢❡❛t✉r❡s✿ ❖❜❥❡❝t✲♦r✐❡♥t❡❞ ♣r♦❣r❛♠♠✐♥❣ ❋✉♥❝t✐♦♥❛❧ ♣r♦❣r❛♠♠✐♥❣ ❆❧❣❡❜r❛✐❝ ❞❛t❛ t②♣❡s ❊①t❡♥s✐❜❧❡ ♣❛tt❡r♥ ♠❛t❝❤✐♥❣ ❚②♣❡ ✐♥❢❡r❡♥❝❡ ▲❛③② ❡✈❛❧✉❛t✐♦♥ ❚❤❡ ❧✐st ❣♦❡s ♦♥ ✳ ✳ ✳ ❇✉t ✳ ✳ ✳ ♥♦ ❧♦✈❡ ❢♦r ✉♥✐✜❝❛t✐♦♥ ✳ ✳ ✳ ❂✭ ◆♦ ❜✉✐❧t✲✐♥ s✉♣♣♦rt ◆♦ ♦✣❝✐❛❧ ❧✐❜r❛r✐❡s ✸✴✶✽
❆❧❣❡❜r❛✐❝ ❉❛t❛ ❚②♣❡s ❛♥❞ P❛tt❡r♥ ▼❛t❝❤✐♥❣ ✐♥ ❙❝❛❧❛ ❉❡✜♥✐♥❣ ❛❧❣❡❜r❛✐❝ ❞❛t❛ t②♣❡s✿ abstract class Term case class Var(name: String) extends Term case class Fun(arg: String, body: Term) extends Term case class App(f: Term, v: Term) extends Term ❇✉✐❧t✲✐♥ s✉♣♣♦rt ❢♦r ♣❛tt❡r♥ ♠❛t❝❤✐♥❣✿ def printTerm(term: Term) { term match { case Var(n) => print(n) case Fun(x, b) => print("^" + x + ".") printTerm(b) case App(f, v) => printTerm(f) print(" ") printTerm(v) } } ✹✴✶✽
❚❤❛t✬s ✇❤❛t ♦✉r ❙❝❛❧❛ ✉♥✐✜❝❛t✐♦♥ ❧✐❜r❛r② ❞♦❡s✦ ❯♥✐✜❝❛t✐♦♥ ▲✐❜r❛r② ✐♥ ❙❝❛❧❛ ❲♦✉❧❞♥✬t ✐t ❜❡ ❣r❡❛t ✐❢ ❙❝❛❧❛ ♣r♦✈✐❞❡❞ ❝♦♥tr♦❧ st❛t❡♠❡♥ts ❢♦r ✉♥✐✜❝❛t✐♦♥ ❄ ❙✐♠✐❧❛r t♦ ♠❛t❝❤ st❛t❡♠❡♥t ❢♦r ♣❛tt❡r♥ ♠❛t❝❤✐♥❣ ✺✴✶✽
❯♥✐✜❝❛t✐♦♥ ▲✐❜r❛r② ✐♥ ❙❝❛❧❛ ❲♦✉❧❞♥✬t ✐t ❜❡ ❣r❡❛t ✐❢ ❙❝❛❧❛ ♣r♦✈✐❞❡❞ ❝♦♥tr♦❧ st❛t❡♠❡♥ts ❢♦r ✉♥✐✜❝❛t✐♦♥ ❄ ❙✐♠✐❧❛r t♦ ♠❛t❝❤ st❛t❡♠❡♥t ❢♦r ♣❛tt❡r♥ ♠❛t❝❤✐♥❣ ❚❤❛t✬s ✇❤❛t ♦✉r ❙❝❛❧❛ ✉♥✐✜❝❛t✐♦♥ ❧✐❜r❛r② ❞♦❡s✦ val x: Term = new LogVar() 1 val y: Term = new LogVar() 2 val f: Term = F(Const(5),x) 3 f unify ( 4 Const(4) withMgu θ => { 5 ... 6 7 }, 8 F(y,Const(4)) >=> { 9 ... 10 } 11 ) 12 ✻✴✶✽
❯♥✐✜❝❛t✐♦♥ ▲✐❜r❛r② ✐♥ ❙❝❛❧❛ ❲♦✉❧❞♥✬t ✐t ❜❡ ❣r❡❛t ✐❢ ❙❝❛❧❛ ♣r♦✈✐❞❡❞ ❝♦♥tr♦❧ st❛t❡♠❡♥ts ❢♦r ✉♥✐✜❝❛t✐♦♥ ❄ ❙✐♠✐❧❛r t♦ ♠❛t❝❤ st❛t❡♠❡♥t ❢♦r ♣❛tt❡r♥ ♠❛t❝❤✐♥❣ ❚❤❛t✬s ✇❤❛t ♦✉r ❙❝❛❧❛ ✉♥✐✜❝❛t✐♦♥ ❧✐❜r❛r② ❞♦❡s✦ val x: Term = new LogVar() // declaring new logical variable x 1 val y: Term = new LogVar() 2 val f: Term = F(Const(5),x) 3 f unify ( 4 Const(4) withMgu θ => { 5 ... 6 7 }, 8 F(y,Const(4)) >=> { 9 ... 10 } 11 ) 12 ✼✴✶✽
❯♥✐✜❝❛t✐♦♥ ▲✐❜r❛r② ✐♥ ❙❝❛❧❛ ❲♦✉❧❞♥✬t ✐t ❜❡ ❣r❡❛t ✐❢ ❙❝❛❧❛ ♣r♦✈✐❞❡❞ ❝♦♥tr♦❧ st❛t❡♠❡♥ts ❢♦r ✉♥✐✜❝❛t✐♦♥ ❄ ❙✐♠✐❧❛r t♦ ♠❛t❝❤ st❛t❡♠❡♥t ❢♦r ♣❛tt❡r♥ ♠❛t❝❤✐♥❣ ❚❤❛t✬s ✇❤❛t ♦✉r ❙❝❛❧❛ ✉♥✐✜❝❛t✐♦♥ ❧✐❜r❛r② ❞♦❡s✦ val x: Term = new LogVar() // declaring new logical variable x 1 val y: Term = new LogVar() // declaring new logical variable y 2 val f: Term = F(Const(5),x) 3 f unify ( 4 Const(4) withMgu θ => { 5 ... 6 7 }, 8 F(y,Const(4)) >=> { 9 ... 10 } 11 ) 12 ✽✴✶✽
❯♥✐✜❝❛t✐♦♥ ▲✐❜r❛r② ✐♥ ❙❝❛❧❛ ❲♦✉❧❞♥✬t ✐t ❜❡ ❣r❡❛t ✐❢ ❙❝❛❧❛ ♣r♦✈✐❞❡❞ ❝♦♥tr♦❧ st❛t❡♠❡♥ts ❢♦r ✉♥✐✜❝❛t✐♦♥ ❄ ❙✐♠✐❧❛r t♦ ♠❛t❝❤ st❛t❡♠❡♥t ❢♦r ♣❛tt❡r♥ ♠❛t❝❤✐♥❣ ❚❤❛t✬s ✇❤❛t ♦✉r ❙❝❛❧❛ ✉♥✐✜❝❛t✐♦♥ ❧✐❜r❛r② ❞♦❡s✦ val x: Term = new LogVar() // declaring new logical variable x 1 val y: Term = new LogVar() // declaring new logical variable y 2 val f: Term = F(Const(5),x) // f is the term F(Const(5),x) 3 f unify ( 4 Const(4) withMgu θ => { 5 ... 6 7 }, 8 F(y,Const(4)) >=> { 9 ... 10 } 11 ) 12 ✾✴✶✽
❯♥✐✜❝❛t✐♦♥ ▲✐❜r❛r② ✐♥ ❙❝❛❧❛ ❲♦✉❧❞♥✬t ✐t ❜❡ ❣r❡❛t ✐❢ ❙❝❛❧❛ ♣r♦✈✐❞❡❞ ❝♦♥tr♦❧ st❛t❡♠❡♥ts ❢♦r ✉♥✐✜❝❛t✐♦♥ ❄ ❙✐♠✐❧❛r t♦ ♠❛t❝❤ st❛t❡♠❡♥t ❢♦r ♣❛tt❡r♥ ♠❛t❝❤✐♥❣ ❚❤❛t✬s ✇❤❛t ♦✉r ❙❝❛❧❛ ✉♥✐✜❝❛t✐♦♥ ❧✐❜r❛r② ❞♦❡s✦ val x: Term = new LogVar() // declaring new logical variable x 1 val y: Term = new LogVar() // declaring new logical variable y 2 val f: Term = F(Const(5),x) // f is the term F(Const(5),x) 3 f unify ( // the unification control statement 4 Const(4) withMgu θ => { 5 ... 6 7 }, 8 F(y,Const(4)) >=> { 9 ... 10 } 11 ) 12 ✶✵✴✶✽
❯♥✐✜❝❛t✐♦♥ ▲✐❜r❛r② ✐♥ ❙❝❛❧❛ ❲♦✉❧❞♥✬t ✐t ❜❡ ❣r❡❛t ✐❢ ❙❝❛❧❛ ♣r♦✈✐❞❡❞ ❝♦♥tr♦❧ st❛t❡♠❡♥ts ❢♦r ✉♥✐✜❝❛t✐♦♥ ❄ ❙✐♠✐❧❛r t♦ ♠❛t❝❤ st❛t❡♠❡♥t ❢♦r ♣❛tt❡r♥ ♠❛t❝❤✐♥❣ ❚❤❛t✬s ✇❤❛t ♦✉r ❙❝❛❧❛ ✉♥✐✜❝❛t✐♦♥ ❧✐❜r❛r② ❞♦❡s✦ val x: Term = new LogVar() // declaring new logical variable x 1 val y: Term = new LogVar() // declaring new logical variable y 2 val f: Term = F(Const(5),x) // f is the term F(Const(5),x) 3 f unify ( // the unification control statement 4 Const(4) withMgu θ => { // try unifying f and Const(4), producing mgu θ 5 ... // it’s pure: no side-effects on x and y , 6 substitution θ available // 7 }, 8 F(y,Const(4)) >=> { 9 ... 10 } 11 ) 12 ✶✶✴✶✽
❯♥✐✜❝❛t✐♦♥ ▲✐❜r❛r② ✐♥ ❙❝❛❧❛ ❲♦✉❧❞♥✬t ✐t ❜❡ ❣r❡❛t ✐❢ ❙❝❛❧❛ ♣r♦✈✐❞❡❞ ❝♦♥tr♦❧ st❛t❡♠❡♥ts ❢♦r ✉♥✐✜❝❛t✐♦♥ ❄ ❙✐♠✐❧❛r t♦ ♠❛t❝❤ st❛t❡♠❡♥t ❢♦r ♣❛tt❡r♥ ♠❛t❝❤✐♥❣ ❚❤❛t✬s ✇❤❛t ♦✉r ❙❝❛❧❛ ✉♥✐✜❝❛t✐♦♥ ❧✐❜r❛r② ❞♦❡s✦ val x: Term = new LogVar() // declaring new logical variable x 1 val y: Term = new LogVar() // declaring new logical variable y 2 val f: Term = F(Const(5),x) // f is the term F(Const(5),x) 3 f unify ( // the unification control statement 4 Const(4) withMgu θ => { // try unifying f and Const(4), producing mgu θ 5 ... // it’s pure: no side-effects on x and y , 6 substitution θ available // 7 }, 8 F(y,Const(4)) >=> { // try unifying f and F(y,Const(4)), ‘‘imperatively’’ 9 mgu [ ✺ / y , ✹ / x ] applied to x and y as side-effect ... // 10 } 11 ) 12 ✶✷✴✶✽
Recommend
More recommend