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))))
|