Skip to content

Latest commit

 

History

History
35 lines (27 loc) · 746 Bytes

exercise-11-2.org

File metadata and controls

35 lines (27 loc) · 746 Bytes

Exercise 11-2

Some people find the <- notation difficult to read. Define macros rule and fact so that we can write:

(fact (likes Robin cats))
(rule (likes Sandy ?x) if (likes ?x cats))

Code:

(in-package #:cl-prolog)

(defmacro fact (&rest clause)
  `(if (not (null (cdr ',clause)))
      nil
      (add-clause ',clause)))

(defmacro rule (head if &rest body)
  `(add-clause (append (list ',head) ',body)))

Tests

(fact (likes Kim Robin))
(fact (likes Sandy Lee))
(fact (likes Sandy Kim))
(fact (likes Robin cats))
(rule (likes Sandy ?x) if  (likes ?x cats))
(rule (likes Kim ?x) if  (likes ?x Lee) (likes ?x Kim))