;;; Commentary: ;;; This is a toy example program adapted from ;;; ;;; Paradigms of Artificial Intelligence Programming: ;;; Case Studies in Common Lisp ;;; ;;; written down purely because the approach is similar ;;; to something I need in a different project. ;;; Code: (define-module (ss-gen) #:export (*grammer* rewrites)) (define *simple-grammer* '((sentence (noun-phrase verb-phrase)) (noun-phrase (Article Noun)) (verb-phrase (Verb noun-phrase)) (Article the a) (Noun man ball woman table) (Verb hit took saw liked))) (define *grammer* *simple-grammer*) (define (rule-rhs rule) "Returns the right hand side of RULE. Returns false if there are no rewrites." (if rule (cdr rule) #f)) (define (rewrites category) "Returns a list of the possible rewrites for CATEGORY." (rule-rhs (assoc category *grammer*))) (define (random-elt lst) "Selects a random element from LST." (let* ((len (length lst)) (index (random len))) (list-ref lst index))) (define (generate phrase) "Generates a random sentence or phrase." (cond ((list? phrase) (apply append (map generate phrase))) ((rewrites phrase) (generate (random-elt (rewrites phrase)))) (#t (list phrase))))