examples/zebra-wam.lisp @ 9d42a27624fd

`tree-collect` is slow and conses a ton
author Steve Losh <steve@stevelosh.com>
date Fri, 15 Jul 2016 20:43:32 +0000
parents 1411666a60f8
children (none)
(in-package #:bones.wam)

(reset-database)
(push-logic-frame)

(fact (member ?item (list* ?item ?)))
(rule (member ?item (list* ? ?rest))
  (member ?item ?rest))

(rule (next-to ?x ?y ?list)
  (in-order ?x ?y ?list))

(rule (next-to ?x ?y ?list)
  (in-order ?y ?x ?list))

(fact (in-order ?x ?y (list* ?x ?y ?)))
(rule (in-order ?x ?y (list* ? ?rest))
  (in-order ?x ?y ?rest))

(rule (= ?x ?x))

(rule
    (zebra ?houses ?water-drinker ?zebra-owner)
  ;; Houses are of the form:
  ;; (HOUSE ?country ?pet ?cigarette ?drink ?color)

  (= ?houses
     (list (house norway ? ? ? ?)
           ?
           (house ? ? ? milk ?)
           ?
           ?))

  (member   (house england ?      ?            ?            red   ) ?houses)
  (member   (house spain   dog    ?            ?            ?     ) ?houses)
  (member   (house ?       ?      ?            coffee       green ) ?houses)
  (member   (house ukraine ?      ?            tea          ?     ) ?houses)
  (member   (house ?       snails winston      ?            ?     ) ?houses)
  (member   (house ?       ?      kools        ?            yellow) ?houses)
  (member   (house ?       ?      lucky-strike orange-juice ?     ) ?houses)
  (member   (house japan   ?      parliaments  ?            ?     ) ?houses)
  (in-order (house ?       ?      ?            ?            ivory )
            (house ?       ?      ?            ?            green ) ?houses)
  (next-to  (house ?       ?      chesterfield ?            ?     )
            (house ?       fox    ?            ?            ?     ) ?houses)
  (next-to  (house ?       ?      kools        ?            ?     )
            (house ?       horse  ?            ?            ?     ) ?houses)
  (next-to  (house norway  ?      ?            ?            ?     )
            (house ?       ?      ?            ?            blue  ) ?houses)

  (member (house ?water-drinker ?     ? water ?) ?houses)
  (member (house ?zebra-owner   zebra ? ?     ?) ?houses))

(finalize-logic-frame)

(time (query-all (zebra ?houses ?water ?zebra)))
; (declaim (optimize (speed 3) (safety 0)))