;;;; -*- Mode: Lisp; Syntax: Common-Lisp -*-
;;;; Code from Paradigms of AI Programming
;;;; Copyright (c) 1991 Peter Norvig

(<- (member ?item (?item . ?rest)))
(<- (member ?item (?x . ?rest)) (member ?item ?rest))

(?- (member 2 ?list))
;;;; ?LIST = (2 . ?REST3302);
;;;; ?LIST = (?X3303 2 . ?REST3307);
;;;; ?LIST = (?X3303 ?X3308 2 . ?REST3312);
;;;; ?LIST = (?X3303 ?X3308 ?X3313 2 . ?REST3317).
;;;; No.

(?- (member ?item ?list))
;;;; ?ITEM = ?ITEM3318
;;;; ?LIST = (?ITEM3318 . ?REST3319);
;;;; ?ITEM = ?ITEM3323
;;;; ?LIST = (?X3320 ?ITEM3323 . ?REST3324);
;;;; ?ITEM = ?ITEM3328
;;;; ?LIST = (?X3320 ?X3325 ?ITEM3328 . ?REST3329);
;;;; ?ITEM = ?ITEM3333
;;;; ?LIST = (?X3320 ?X3325 ?X3330 ?ITEM3333 . ?REST3334).
;;;; No.

(<- (length () 0))
(<- (length (?x . ?y) (1+ ?n)) (length ?y ?n))

(?- (length (a b c d) ?n))
;;;; ?N = (1+ (1+ (1+ (1+ 0))));
;;;; No.

(?- (length ?list (1+ (1+ 0))))
;;;; ?LIST = (?X3869 ?X3872);
;;;; No.

(?- (length ?list ?n))
;;;; ?LIST = NIL
;;;; ?N = 0;
;;;; ?LIST = (?X3918)
;;;; ?N = (1+ 0);
;;;; ?LIST = (?X3918 ?X3921)
;;;; ?N = (1+ (1+ 0)).
;;;; No.

(?- (length ?l (1+ (1+ 0))) (member a ?l))
;;;; ?L = (A ?X4057);
;;;; ?L = (?Y4061 A);
;;;; No.

(?- (member a ?l) (length ?l (1+ (1+ 0))))
;;;; ?L = (A ?X4081);
;;;; ?L = (?Y4085 A);[Abort]

;;;; Section 11.4 (The Zebra Problem)

(<- (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)
  ;; Each house is of the form:
  ;; (house nationality pet cigarette drink house-color)
  (= ?h ((house norwegian ? ? ? ?)               ;1,10
         ? 
         (house ? ? ? milk ?) ? ?))              ; 9
  (member (house englishman ? ? ? red) ?h)       ; 2
  (member (house spaniard dog ? ? ?) ?h)         ; 3
  (member (house ? ? ? coffee green) ?h)         ; 4
  (member (house ukrainian ? ? tea ?) ?h)         ; 5
  (iright (house ? ? ? ? ivory)                  ; 6
          (house ? ? ? ? green) ?h)
  (member (house ? snails winston ? ?) ?h)       ; 7
  (member (house ? ? kools ? yellow) ?h)         ; 8
  (nextto (house ? ? chesterfield ? ?)           ;11
          (house ? fox ? ? ?) ?h)
  (nextto (house ? ? kools ? ?)                  ;12
          (house ? horse ? ? ?) ?h)
  (member (house ? ? luckystrike oj ?) ?h)       ;13
  (member (house japanese ? parliaments ? ?) ?h) ;14
  (nextto (house norwegian ? ? ? ?)              ;15
          (house ? ? ? ? blue) ?h)
  (member (house ?w ? ? water ?) ?h)             ;Q1
  (member (house ?z zebra ? ? ?) ?h))            ;Q2

(?- (zebra ?houses ?water-drinker ?zebra-owner))
;;;; ?HOUSES = ((HOUSE NORWEGIAN FOX KOOLS WATER YELLOW)
;;;;           (HOUSE UKRAINIAN HORSE CHESTERFIELD TEA BLUE)
;;;;           (HOUSE ENGLISHMAN SNAILS WINSTON MILK RED)
;;;;           (HOUSE SPANIARD DOG LUCKYSTRIKE OJ IVORY)
;;;;           (HOUSE JAPANESE ZEBRA PARLIAMENTS COFFEE GREEN))
;;;; ?WATER-DRINKER = NORWEGIAN
;;;; ?ZEBRA-OWNER = JAPANESE.
;;;; No.

