summaryrefslogtreecommitdiff
path: root/ss-generator/ss-gen.scm
blob: fc668b6801c809314c752f28d1f56c61ba20a4af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
;;; 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))))