diff options
author | bd <bdunahu@operationnull.com> | 2024-06-27 01:25:16 -0600 |
---|---|---|
committer | bd <bdunahu@operationnull.com> | 2024-06-27 01:25:16 -0600 |
commit | e07c1aae40ce1f63922a02ed30504405800cecc4 (patch) | |
tree | 2a53db581f6e933b39624db44582adb32b73aa92 | |
parent | 03ad9b7eadb02b05e4eb5074d0fdaadf8dc4ee00 (diff) |
Add ss-generator, a simple sentence generator
-rw-r--r-- | ss-generator/ss-gen-test.scm | 24 | ||||
-rw-r--r-- | ss-generator/ss-gen.scm | 49 |
2 files changed, 73 insertions, 0 deletions
diff --git a/ss-generator/ss-gen-test.scm b/ss-generator/ss-gen-test.scm new file mode 100644 index 0000000..b550421 --- /dev/null +++ b/ss-generator/ss-gen-test.scm @@ -0,0 +1,24 @@ +;; -*- compile-command: "guile -L . ss-gen-test.scm"; -*- +(use-modules (srfi srfi-64) + (ss-gen)) + +(test-begin "harness") + + +(test-equal "default Noun is a list of non-terminals" + '(Noun man ball woman table) + (assoc 'Noun *grammer*)) + +(test-equal "default verb-phrase is a list of terminals" + '(verb-phrase (Verb noun-phrase)) + (assoc 'verb-phrase *grammer*)) + +(test-equal "default Verb resolve to expected words" + '(hit took saw liked) + (rewrites 'Verb)) + +(test-assert "rewrites non-existent" + (not (rewrites 'Item))) + + +(test-end "harness") diff --git a/ss-generator/ss-gen.scm b/ss-generator/ss-gen.scm new file mode 100644 index 0000000..fc668b6 --- /dev/null +++ b/ss-generator/ss-gen.scm @@ -0,0 +1,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)))) |