Introduction The Problem The Algorithm Examples Implementation Unifjcation Dr. Mattox Beckman University of Illinois at Urbana-Champaign Department of Computer Science
Introduction The Problem The Algorithm Examples Implementation Objectives You should be able to... Unifjcation is a third major topic that will appear many times in this course. It is used in languages such as Haskell and Prolog, and also in theoretical discussions. ◮ Be able to describe the problem of unifjcation. ◮ Be able to solve a unifjcation problem. ◮ Be able to implement unifjcation in Haskell. ◮ Know how to use unifjcation to implement pattern matching. ◮ Know how to use unifjcation to check types of functions.
Introduction The Problem The Algorithm Examples Implementation The Domain Terms Have name and arity ◮ The name will be in western alphabet ◮ Arity = “number of arguments” — may be zero ◮ Examples: x, z, f(x,y), x(y,f,z) Variables Written using Greek alphabet, may be subscripted ◮ Represent a target for substitution ◮ Examples: α, β 12 , γ 7 Substitutions Mappings from Variables to Terms ◮ Examples: σ = { α �→ f ( x , β ) , β �→ y } ◮ Substitutions are applied : σ ( g ( β )) → g ( y ) Note: arguments to terms may have non-zero arity, or may be variables.
Introduction The Problem The Algorithm Examples Implementation The Problem ◮ Given terms s and t , try to fjnd a substitution σ such that σ ( s ) = σ ( t ) . ◮ If such a substitution exists, it is said that s and t unify. ◮ A unifjcation problem is a set of equations S = { s 1 = t 1 , s 2 = t 2 , . . . } . ◮ A unifjcation problem S = { x 1 = t 1 , x 2 = t 2 , . . . } is in solved form if ◮ the terms x i are distinct variables ◮ none of them occur in t i . Our approach: given a unifjcation problem S , we want to fjnd the most general unifjer σ that solves it. We will do this by transforming the equations.
Introduction The Problem The Algorithm Examples Implementation Four Operations Start with a unifjcation problem S = { s 1 = t 1 , s 2 = t 2 , . . . } and apply the following transformations as necessary: Delete A trivial equation t = t can be deleted. Decompose An equation f ( t n ) = f ( u n ) can be replaced by the set { t 1 = u 1 , . . . , t n = u n } Orient An equation t = x can be replaced by x = t if x is a variable and t is not. Eliminate an equation x = t can be used to substitute all occurrences of x in the remainder of S .
Introduction The Problem The Algorithm Examples Implementation Example (Stolen from “Term Rewriting and All That”) { α = f ( x ) , g ( α, α ) = g ( α, β ) }
Introduction The Problem The Algorithm Examples Implementation Example (Stolen from “Term Rewriting and All That”) { α = f ( x ) , g ( α, α ) = g ( α, β ) } We can use the Eliminate method, replace α with f ( x ) on the right sides of the equations.
Introduction The Problem The Algorithm Examples Implementation Example (Stolen from “Term Rewriting and All That”) { α = f ( x ) , g ( α, α ) = g ( α, β ) } We can use the Eliminate method, replace α with f ( x ) on the right sides of the equations. { α = f ( x ) , g ( f ( x ) , f ( x )) = g ( f ( x ) , β ) } We can use the Decompose method, and get rid of the g functions.
Introduction The Problem The Algorithm Examples Implementation Example (Stolen from “Term Rewriting and All That”) { α = f ( x ) , g ( α, α ) = g ( α, β ) } We can use the Eliminate method, replace α with f ( x ) on the right sides of the equations. { α = f ( x ) , g ( f ( x ) , f ( x )) = g ( f ( x ) , β ) } We can use the Decompose method, and get rid of the g functions. { α = f ( x ) , f ( x ) = f ( x ) , f ( x ) = β } We can delete the f ( x ) = f ( x ) equation.
Introduction The Problem The Algorithm Examples Implementation Example (Stolen from “Term Rewriting and All That”) { α = f ( x ) , g ( α, α ) = g ( α, β ) } We can use the Eliminate method, replace α with f ( x ) on the right sides of the equations. { α = f ( x ) , g ( f ( x ) , f ( x )) = g ( f ( x ) , β ) } We can use the Decompose method, and get rid of the g functions. { α = f ( x ) , f ( x ) = f ( x ) , f ( x ) = β } We can delete the f ( x ) = f ( x ) equation. { α = f ( x ) , f ( x ) = β } Now we can reorient to make the variables show up on the left side.
Introduction The Problem The Algorithm Examples Implementation Example (Stolen from “Term Rewriting and All That”) { α = f ( x ) , g ( α, α ) = g ( α, β ) } We can use the Eliminate method, replace α with f ( x ) on the right sides of the equations. { α = f ( x ) , g ( f ( x ) , f ( x )) = g ( f ( x ) , β ) } We can use the Decompose method, and get rid of the g functions. { α = f ( x ) , f ( x ) = f ( x ) , f ( x ) = β } We can delete the f ( x ) = f ( x ) equation. { α = f ( x ) , f ( x ) = β } Now we can reorient to make the variables show up on the left side. { α = f ( x ) , β = f ( x ) } Now we are done.... S = { α �→ f ( x ) , β �→ f ( x ) }
Introduction The Problem The Algorithm Examples Implementation Example — Compatibility ◮ Your advisor wants you to take CS 421 and some theory class. ◮ Your mom wants you to take CS 374 and some languages class. ◮ Can both your advisor and your mom be happy? This is a problem we can solve using unifjcation: ◮ Let f be a “schedule function”, the fjrst argument is a language class, the second argument is a theory class. ◮ s = f ( cs 421 , β ) (where β is a theory class) ◮ t = f ( α, cs 374) (where α is a language class) ◮ Let σ = { α �→ cs 421 , β �→ cs 374 }
inc :: Int -> Int map :: (a -> b) -> [a] -> [b] foo :: [Int] Introduction The Problem The Algorithm Examples Implementation Example — Types Type checking is also a form of unifjcation. Will map(inc)(foo) work? S = { ( α ⇒ β ) = ( Int ⇒ Int ) , List [ α ] = List [ Int ] }
Introduction The Problem The Algorithm Examples Implementation Type Checking Solution S = { ( α ⇒ β ) = ( Int ⇒ Int ) , List [ α ] = List [ Int ] } ◮ Decompose: { α = Int , β = Int , List [ α ] = List [ Int ] } ◮ Substitute: { α = Int , β = Int , List [ Int ] = List [ Int ] } ◮ Delete: { α = Int , β = Int } The original type of map was ( α ⇒ β ) ⇒ List [ α ] ⇒ List [ β ] We can use our pattern to get the output type: S ( List [ β ]) ≡ List [ Int ]
inc : String -> Int map :: (a->b) -> [a] -> [b] foo : [Int] Introduction The Problem The Algorithm Examples Implementation Example 2 — Types Here’s an example that fails. Will map(inc)(foo) work? S = { ( α ⇒ β ) = ( String ⇒ Int ) , List [ α ] = List [ Int ] }
Introduction The Problem The Algorithm Examples Implementation Type Checking 2 Solution S = { ( α ⇒ β ) = ( String ⇒ Int ) , List [ α ] = List [ Int ] } ◮ Decompose: { α = String , β = Int , List [ α ] = List [ Int ] } ◮ Substitute: { α = string , β = Int , List [ String ] = List [ Int ] } ◮ Error: List [ string ] � = List [ Int ] !
Introduction The Problem The Algorithm Examples Implementation How to make this work in Haskell To build a unifjer, you need: ◮ a way to represent unifjcation problems... i.e., a type, ◮ a way to decide which unifjcation step is appropriate, ◮ (and a way to tell when we are done) ◮ and functions to perform the various unifjcation steps. How should we represent things?
Introduction The Problem The Algorithm Examples Implementation Strategy for Writing the Function ◮ You need three lists: ◮ One is the list of solved-form equations. ◮ Two form a queue of elements in progress. ◮ You need functions to perform the transformations we need. ◮ Substitute ◮ Deconstruct ◮ Reorient (easy) ◮ Drop (very easy) ◮ You may need a fmag to indicate completion. Time to start coding! We’ll implement this in class.
Recommend
More recommend