NB. Chapter 14, Artificial Intelligence

ls =: ('a' ; 1) ; ('b' ; 2) ; box 'c' ; 3

assoc1 =: monad define script
('symbol' ; 'alist') =. y.
if. nullp alist
  do. 0
  elseif. symbol match  head t =. head alist
    do. t
  elseif. 1
    do. assoc1 symbol ; box rest alist
end.
)

assoc =: dyad define 'try. open ((0 from rank 1 open y.) i. box x.) from y. catch. 0 end.'


pairlis1 =: monad define script
('ls1' ; 'ls2') =. y.
if. nullp rest ls1
  do. box (head ls1) ; head ls2
  else. ((head ls1) ; head ls2) ; pairlis1 (rest ls1) ; rest ls2
end.
)

pairlis =: dyad define 'box rank 1 x. stitch y.'

NB. Property list definitions

NB. top-level name/property list chain

name_list =: ''

NB. look-aside cache

last_look =: ''

NB. locate the name/property list pair

name_prop =: monad define script
if. y. match head last_look
  do. last_look
  else. pair =. assoc y. ; box name_list
    if. 0 not_equal pair
      do. last_look =: pair
      else. pair
    end.
  pair
end.
)

NB. get

get =: monad define script
('name' ; 'prop') =. y.
plist =. name_prop name
if. 0 not_equal plist
  do. item =. assoc prop ; box rest plist
    if. 0 not_equal item
      do. rest item
      else. 0
    end.
  else. o
end.
)

NB. put

put =: monad define script
('name' ; 'prop' ; 'value') =. y.
plist =. name_prop name
if. 0 ~: plist
