Use a queues instead of lists for the logic frame pending predicates
I wonder if this is ACTUALLY faster, since often there will probably only be
a couple of entries in a particular predicate's list? But then again there are
some HUGE predicates (e.g. successor relations), so it'll benefit us there.
Either way, conceptually the thing should be FIFO, so as long as using queues
doesn't COST us performance I'm happy.
author |
Steve Losh <steve@stevelosh.com> |
date |
Tue, 05 Jul 2016 23:37:14 +0000 |
parents |
ae2b13a9a629 |
children |
(none) |
(in-package #:bones.paip)
(clear-db)
(rule (member ?item (?item . ?)))
(rule (member ?item (? . ?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))
(rule (in-order ?x ?y (?x ?y . ?)))
(rule (in-order ?x ?y (? . ?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
((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))
(time (query-all (zebra ?houses ?water ?zebra)))
; (declaim (optimize (speed 3) (safety 0)))