(load "util.scm") (load "misc/sicp-ambeval.scm") (define the-global-environment (setup-environment)) (define result '()) (define (amball exp) (set! result '()) ; reset result (ambeval exp the-global-environment (lambda (value next) (set! result (cons value result)) (next)) (lambda () result)) (set! result (reverse result)) result) (amball '(begin (define (require p) (if (not p) (amb))) (define nouns '(noun student professor cat class)) (define verbs '(verb studies lectures eats sleeps)) (define articles '(article the a)) (define prepositions '(prep for to in by with)) (define adjectives '(adjective pretty kind mean bad)) (define (parse-word word-list) (require (not (null? *unparsed*))) (require (memq (car *unparsed*) (cdr word-list))) (let ((found-word (car *unparsed*))) (set! *unparsed* (cdr *unparsed*)) (list (car word-list) found-word))) (define (parse-prepositional-phrase) (list 'prep-phrase (parse-word prepositions) (parse-noun-phrase))) (define (parse-sentence) (list 'sentence (parse-noun-phrase) (parse-verb-phrase))) (define (parse-noun-phrase) (define (maybe-extend noun-phrase) (amb noun-phrase (maybe-extend (list 'noun-phrase noun-phrase (parse-prepositional-phrase))))) (maybe-extend (parse-simple-noun-phrase))) (define (parse-verb-phrase) (define (maybe-extend verb-phrase) (amb verb-phrase (maybe-extend (list 'verb-phrase verb-phrase (parse-prepositional-phrase))))) (maybe-extend (parse-word verbs))) (define (parse-simple-noun-phrase) (list 'simple-noun-phrase (parse-word articles) (parse-word nouns))) (define *unparsed* '()) (define (parse input) (set! *unparsed* input) (let ((sent (parse-sentence))) (require (null? *unparsed*)) sent)) (parse '(the professor lectures to the student with the cat)) )) ;'The professor lectures to the student in the class with the cat.' (assert (first result) '(sentence (simple-noun-phrase (article the) (noun professor)) (verb-phrase (verb-phrase (verb lectures) (prep-phrase (prep to) (simple-noun-phrase (article the) (noun student)))) (prep-phrase (prep with) (simple-noun-phrase (article the) (noun cat)))))) (assert (second result) '(sentence (simple-noun-phrase (article the) (noun professor)) (verb-phrase (verb lectures) (prep-phrase (prep to) (noun-phrase (simple-noun-phrase (article the) (noun student)) (prep-phrase (prep with) (simple-noun-phrase (article the) (noun cat)))))))) (display "\nex-4.45 - sentence-meanings\n") (amball '(parse '(The professor lectures to the student in the class with the cat))) (assert (length result) 5) '(sentence (simple-noun-phrase (article the) (noun professor)) (verb-phrase (verb-phrase (verb-phrase (verb lectures) (prep-phrase (prep to) (simple-noun-phrase (article the) (noun student)))) (prep-phrase (prep in) (simple-noun-phrase (article the) (noun class)))) (prep-phrase (prep with) (simple-noun-phrase (article the) (noun cat))))) ; (The professor lectures (to the student) in the class with the cat). '(sentence (simple-noun-phrase (article the) (noun professor)) (verb-phrase (verb-phrase (verb lectures) (prep-phrase (prep to) (simple-noun-phrase (article the) (noun student)))) (prep-phrase (prep in) (noun-phrase (simple-noun-phrase (article the) (noun class)) (prep-phrase (prep with) (simple-noun-phrase (article the) (noun cat))))))) ; (The professor lectures to the student (in the class with the cat)). '(sentence (simple-noun-phrase (article the) (noun professor)) (verb-phrase (verb-phrase (verb lectures) (prep-phrase (prep to) (noun-phrase (simple-noun-phrase (article the) (noun student)) (prep-phrase (prep in) (simple-noun-phrase (article the) (noun class)))))) (prep-phrase (prep with) (simple-noun-phrase (article the) (noun cat))))) ; The professor lectures (to the student in the class) with the cat. '(sentence (simple-noun-phrase (article the) (noun professor)) (verb-phrase (verb lectures) (prep-phrase (prep to) (noun-phrase (noun-phrase (simple-noun-phrase (article the) (noun student)) (prep-phrase (prep in) (simple-noun-phrase (article the) (noun class)))) (prep-phrase (prep with) (simple-noun-phrase (article the) (noun cat))))))) ; The professor lectures ((to the student in the class) with the cat). '(sentence (simple-noun-phrase (article the) (noun professor)) (verb-phrase (verb lectures) (prep-phrase (prep to) (noun-phrase (simple-noun-phrase (article the) (noun student)) (prep-phrase (prep in) (noun-phrase (simple-noun-phrase (article the) (noun class)) (prep-phrase (prep with) (simple-noun-phrase (article the) (noun cat))))))))) ; The professor lectures (to the student (in the class with the cat)). (display "[answered]\n") (display "\nex-4.46 - evaluation-order\n") ; Consider the definition of parse sentence. Grammar defines that the ; noun-phrase comes before the verb-phrase and that is how we ordered the ; sub-calls to the parser. If the evaluator would read the arguments from right ; to left it would attempt to parse a verb-phrase first and fail for most ; sentences (maybe it would work for questions). We could force the correct ; order by using nested let-expressions to make the code ; interpreter-independent. ; (define (parse-sentence) ; (list 'sentence ; (parse-noun-phrase) ; (parse-word verbs))) (display "[answered]\n") (display "\nex-4.47 - alternative-parse-verb-phrase\n") ; Louis's code results in an endless-loop. The reason is that amb evaluates its ; arguments in applicative order. That means (parse-verb-phrase) executes ; recursively. By parsing the verb-phrase first we avoid this issue. Changing ; the order of the arguments does not resolve this issue. ; (amball '(begin ; (define (parse-verb-phrase) ; (display *unparsed*) (display "\n") ; (amb (parse-word verbs) ; (list 'verb-phrase ; (parse-verb-phrase) ; (parse-prepositional-phrase)))) ; (parse '(the cat eats) ; endless-loop ; ))) (display "[answered]\n") (display "\nex-4.48 - parse-other-phrases\n") ; Exercise 4.48. Extend the grammar given above to handle more complex ; sentences. For example, you could extend noun phrases and verb phrases to ; include adjectives and adverbs, or you could handle compound sentences.53 (amball '(begin (define (parse-simple-noun-phrase) (list 'simple-noun-phrase (parse-word articles) (parse-word nouns))) (define (parse-adjective-noun-phrase adjective) (amb (list 'adjective-phrase adjective (parse-word nouns)) (list 'adjective-phrase adjective (parse-adjective-noun-phrase (parse-word adjectives))))) (define (parse-simple-noun-phrase) (let ((article (parse-word articles))) (amb (list 'simple-noun-phrase article (parse-word nouns)) (list 'adjective-noun-phrase article (parse-adjective-noun-phrase (parse-word adjectives)))))) (parse '(the bad cat eats)))) (assert (first result) '(sentence (adjective-noun-phrase (article the) (adjective-phrase (adjective bad) (noun cat))) (verb eats))) (display "\nex-4.49 - generate-sentence\n") (display "\nex-4.50\n")