Ch5 Nightly 5

In class we discussed the changes necessary in order to check to see if a variable matched an existing value.

We added a keyword argument to pat-match in order to hold the association list of (?var . value) pairs.

This was the pseudo-code we wrote for the revised matcher:

if (variable is already seen) then
  if current value from input is the same as the seen variable then
    recursively call pat-match on the rest of the pattern and input.
  else
    match fail
  end if
else
  set up new variable binding
  recursively call pat-match, including new binding
end if

I recommend using assoc to find the bindings.

Tests

It is ok if you have (T . T) at the end of your association list.

(assert-equal '((?x . happy))
              (pat-match '(?x is ?x) '(happy is happy)))
(assert-false (pat-match '(?x is ?x) '(happy is sad)))
(assert-false (pat-match '(?x is ?y end) '(happy is sad))) ; already ok?
(assert-equal '((?y . cream) (?x . happy))
              (pat-match '(?x is ice ?y) '(happy is ice cream)))