Add prolog module

This commit is contained in:
2026-05-18 14:37:22 -05:00
parent c4c255aa96
commit 0e615741dd
2 changed files with 252 additions and 12 deletions

View File

@@ -1,7 +1,8 @@
(use-modules (d-)
(d- json)
(srfi srfi-1)
(d- test))
(d- json)
(srfi srfi-1)
(d- test)
(d- prolog))
(define-test-suite "~>"
(define-test "unwrapped"
@@ -145,14 +146,57 @@
(define-test "object"
(assert-equal '() (json "{}"))
(assert-equal '((cat . 1)
(bat . #t)
(rat . "yessir"))
(json "{\"cat\": 1, \"bat\": true, \"rat\": \"yessir\"}"))
(bat . #t)
(rat . "yessir"))
(json "{\"cat\": 1, \"bat\": true, \"rat\": \"yessir\"}"))
(assert-equal '((butter . 1)
(brownie))
(json "{\"butter\": 1, \"brownie\": {}}"))
(brownie))
(json "{\"butter\": 1, \"brownie\": {}}"))
(assert-equal '(1 2)
(json "{\"hello\": 1, \"world\": 2}"
#:obj-acons
(lambda (_key value rest)
(cons value rest))))))
(json "{\"hello\": 1, \"world\": 2}"
#:obj-acons
(lambda (_key value rest)
(cons value rest))))))
(define-test-suite "prolog"
;; Stolen verbatim from PAIP (Norvig 92)
(define-test "zebra"
(<- (member ?item (?item . ?rest)))
(<- (member ?item (?x . ?rest)) (member ?item ?rest))
(<- (nextto ?x ?y ?list) (iright ?x ?y ?list))
(<- (nextto ?x ?y ?list) (iright ?y ?x ?list))
(<- (iright ?left ?right (?left ?right . ?rest)))
(<- (iright ?left ?right (?x . ?rest))
(iright ?left ?right ?rest))
(<- (= ?x ?x))
(<- (zebra ?h ?w ?z)
(= ?h ((house norwegian ? ? ? ?)
?
(house ? ? ? milk ?) ? ?))
(member (house englishman ? ? ? red) ?h)
(member (house spaniard dog ? ? ?) ?h)
(member (house ? ? ? coffee green) ?h)
(member (house ukrainian ? ? tea ?) ?h)
(iright (house ? ? ? ? ivory)
(house ? ? ? ? green) ?h)
(member (house ? snails winston ? ?) ?h)
(member (house ? ? kools ? yellow) ?h)
(nextto (house ? ? chesterfield ? ?)
(house ? fox ? ? ?) ?h)
(nextto (house ? ? kools ? ?)
(house ? horse ? ? ?) ?h)
(member (house ? ? luckystrike orange-juice ?) ?h)
(member (house japanese ? parliaments ? ?) ?h)
(nextto (house norwegian ? ? ? ?)
(house ? ? ? ? blue) ?h)
(member (house ?w ? ? water ?) ?h)
(member (house ?z zebra ? ? ?) ?h))
(define get-solution (?- (zebra ? ?water-drinker ?zebra-owner)))
(define solution (get-solution))
(assert-equal 'norwegian (assq-ref solution '?water-drinker))
(assert-equal 'japanese (assq-ref solution '?zebra-owner))))