diff --git a/paip.asd b/paip.asd index 56407d4..4da5b4f 100644 --- a/paip.asd +++ b/paip.asd @@ -7,4 +7,8 @@ :version "0.0.1" :serial t :components ((:file "package") - (:file "paip"))) + (:file "part-1") + (:file "part-2") + (:file "part-3") + (:file "part-4") + (:file "part-5"))) diff --git a/paip.fas b/paip.fas new file mode 100644 index 0000000..6964b22 --- /dev/null +++ b/paip.fas @@ -0,0 +1,261 @@ +(|SYSTEM|::|VERSION| '(20080430.)) +#0Y_ #0Y |CHARSET|::|UTF-8| +#Y(#:|1 3 (IN-PACKAGE #:PAIP)-1| + #17Y(00 00 00 00 00 00 00 00 20 01 DA 31 F6 0F 01 19 01) + ("PAIP" |COMMON-LISP|::|*PACKAGE*|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|6 11 (DEFPARAMETER *TITLES* '(MD SR. JR. ...) ...)-2| + #26Y(00 00 00 00 00 00 00 00 20 01 DA 31 62 DB DC 31 5A DB DD DE 2D 03 05 C6 + 19 01) + ((|COMMON-LISP|::|SPECIAL| |PAIP|::|*TITLES*|) |PAIP|::|*TITLES*| + (|PAIP|::|MD| |PAIP|::|SR.| |PAIP|::|JR.| |PAIP|::|SIR|) + |COMMON-LISP|::|VARIABLE| "Titles aren't part of names." + |SYSTEM|::|%SET-DOCUMENTATION|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|13 17 (DEFUN FIRST-NAME (NAME) ...)-3| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|FIRST-NAME| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|FIRST-NAME| + #29Y(00 00 00 00 01 00 00 00 26 02 94 01 6B 00 38 03 8C C1 04 9E 5B 19 + 02 95 01 29 01 03 6D) + (|PAIP|::|*TITLES*|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|NAME|) + "Select the first name from a NAME represented as a list." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|19 21 (DEFUN LAST-NAME (NAME) ...)-4| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|LAST-NAME| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|LAST-NAME| + #17Y(00 00 00 00 01 00 00 00 26 02 AD 72 63 2F 00 19 02) + (|PAIP|::|FIRST-NAME|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|NAME|) + "Select the last name from a NAME represented as a list." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|23 31 (DEFUN POWER (N M) ...)-5| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|POWER| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|POWER| + #37Y(00 00 00 00 02 00 00 00 26 03 AD 8E AC 11 AD DA 90 01 2F 0E AE AF + 97 03 6C 70 33 02 39 19 03 C5 19 03 9F 19 03) + (1.) (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|N| |PAIP|::|M|) "Raise N to an integer power M." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|33 44 (DEFUN COUNT-ATOMS (EXPR) ...)-6| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|COUNT-ATOMS| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|COUNT-ATOMS| + #38Y(00 00 00 00 01 00 00 00 26 02 92 01 09 C5 19 02 C6 19 02 93 01 77 + 9E 20 77 94 01 6C 76 95 02 6C 72 33 02 37 19 02) + (0. 1.) (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|EXPR|) "Count how many atoms are in EXPR, disregarding NIL." + 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|46 52 (DEFUN COUNT-ALL-ATOMS (EXPR &OPTIONAL #) ...)-7| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|COUNT-ALL-ATOMS| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|COUNT-ALL-ATOMS| + #45Y(00 00 00 00 01 00 01 00 26 08 3B 01 0B C5 F9 92 02 09 9E 19 03 C5 + 19 03 93 02 77 9F 20 77 94 02 DA 6C 67 95 03 DB 6C 62 33 02 37 19 + 03) + (1. 0.) (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|EXPR| |COMMON-LISP|::|&OPTIONAL| (|PAIP|::|IF-NULL| 1.)) + "Count all atoms in EXPR, including NILs only in non-tail position." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|54 64 (DEFUN COUNT-ANYWHERE (OBJ EXPR &OPTIONAL ...) ...)-8| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|COUNT-ANYWHERE| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|COUNT-ANYWHERE| + #57Y(00 00 00 00 02 00 01 00 26 09 3B 01 15 C5 F9 92 02 13 C6 19 04 C7 + 19 04 AD B0 B0 36 02 1C 76 C6 19 04 93 02 6D 9F 20 70 AF 94 03 AF + 6C 5C B0 95 04 B0 6C 56 33 02 37 19 04) + (#.#'|COMMON-LISP|::|EQ| 0. 1.) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|OBJ| |PAIP|::|EXPR| |COMMON-LISP|::|&OPTIONAL| + (|PAIP|::|TEST| #'|COMMON-LISP|::|EQ|)) + "Count how many times an OBJ appears anywhere in an EXPR." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|66 73 (DEFUN DOT-PRODUCT (LIST1 LIST2) ...)-9| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|DOT-PRODUCT| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|DOT-PRODUCT| + #20Y(00 00 00 00 02 00 00 00 26 03 DA DB B0 B0 33 01 16 9B 00 03) + (#.#'|COMMON-LISP|::|+| #.#'|COMMON-LISP|::|*|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|LIST1| |PAIP|::|LIST2|) + "Compute the dot product of LIST1 and LIST2" 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|76 80 (DEFUN MAPPEND (FN LIST) ...)-10| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|MAPPEND| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|MAPPEND| + #19Y(00 00 00 00 02 00 00 00 26 03 DA AF AF 33 00 16 9B 00 03) + (#.#'|COMMON-LISP|::|APPEND|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|FN| |COMMON-LISP|::|LIST|) + "Apply FN to each element of LIST and append the results." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|82 84 (DEFUN ONE-OF (SET) ...)-11| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|ONE-OF| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|ONE-OF| + #17Y(00 00 00 00 01 00 00 00 26 02 AD 6F 00 61 01 19 02) + (|PAIP|::|RANDOM-ELT|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|COMMON-LISP|::|SET|) "Pick one element of SET, and make a list of it." + 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|86 88 (DEFUN RANDOM-ELT (CHOICES) ...)-12| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|RANDOM-ELT| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|RANDOM-ELT| + #22Y(00 00 00 00 01 00 00 00 26 02 AD AE 72 62 38 01 72 F7 32 5E 19 02) + () (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|CHOICES|) "Choose a random element from list CHOICES." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|90 97 (DEFPARAMETER *SIMPLE-GRAMMAR* '(# # # ...) ...)-13| + #26Y(00 00 00 00 00 00 00 00 20 01 DA 31 62 DB DC 31 5A DB DD DE 2D 03 05 C6 + 19 01) + ((|COMMON-LISP|::|SPECIAL| |PAIP|::|*SIMPLE-GRAMMAR*|) + |PAIP|::|*SIMPLE-GRAMMAR*| + ((|PAIP|::|SENTENCE| (|PAIP|::|NOUN-PHRASE| |PAIP|::|VERB-PHRASE|)) + (|PAIP|::|NOUN-PHRASE| (|PAIP|::|ARTICLE| |PAIP|::|NOUN|)) + (|PAIP|::|VERB-PHRASE| (|PAIP|::|VERB| |PAIP|::|NOUN-PHRASE|)) + (|PAIP|::|ARTICLE| |COMMON-LISP|::|THE| |PAIP|::|A|) + (|PAIP|::|NOUN| |PAIP|::|MAN| |PAIP|::|BALL| |PAIP|::|WOMAN| + |PAIP|::|TABLE|) + (|PAIP|::|VERB| |PAIP|::|HIT| |PAIP|::|TOOK| |PAIP|::|SAW| + |PAIP|::|LIKED|)) + |COMMON-LISP|::|VARIABLE| "A grammar for a trivial subset of English." + |SYSTEM|::|%SET-DOCUMENTATION|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|99 100 (DEFVAR *GRAMMAR* *SIMPLE-GRAMMAR* ...)-14| + #31Y(00 00 00 00 00 00 00 00 20 01 DA 31 62 DB 8C 57 05 DB 6B 02 31 5A DB DD + DE 2D 03 05 C6 19 01) + ((|COMMON-LISP|::|SPECIAL| |PAIP|::|*GRAMMAR*|) |PAIP|::|*GRAMMAR*| + |PAIP|::|*SIMPLE-GRAMMAR*| |COMMON-LISP|::|VARIABLE| + "The grammar used by `generate'." |SYSTEM|::|%SET-DOCUMENTATION|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|102 104 (DEFUN RULE-LHS (RULE) ...)-15| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|RULE-LHS| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|RULE-LHS| #14Y(00 00 00 00 01 00 00 00 26 02 9E 5B 19 02) () + (|COMMON-LISP|::|T| |COMMON-LISP|::|NIL| |COMMON-LISP|::|NIL|) + (|PAIP|::|RULE|) "The left-hand side of a RULE." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|106 108 (DEFUN RULE-RHS (RULE) ...)-16| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|RULE-RHS| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|RULE-RHS| #14Y(00 00 00 00 01 00 00 00 26 02 9E 5C 19 02) () + (|COMMON-LISP|::|T| |COMMON-LISP|::|NIL| |COMMON-LISP|::|NIL|) + (|PAIP|::|RULE|) "The right-hand side of a RULE." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|110 112 (DEFUN REWRITES (CATEGORY) ...)-17| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|REWRITES| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|REWRITES| + #21Y(00 00 00 00 01 00 00 00 26 02 AD 6B 00 38 03 71 C8 2F 01 19 02) + (|PAIP|::|*GRAMMAR*| |PAIP|::|RULE-RHS|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|CATEGORY|) + "Return a list of the possible rewrites for CATEGORY." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|114 121 (DEFUN GENERATE (PHRASE) ...)-18| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|GENERATE| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|GENERATE| + #39Y(00 00 00 00 01 00 00 00 26 02 AD 6F 00 AE 8E 1D 08 92 00 0C AE 61 + 01 19 03 99 01 AF 30 02 19 03 14 6F 03 29 01 04 63) + (|PAIP|::|REWRITES| |PAIP|::|GENERATE| |PAIP|::|MAPPEND| + |PAIP|::|RANDOM-ELT|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|PHRASE|) "Generate a random LHS present in `*grammar*'." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|123 149 (DEFPARAMETER *BIGGER-GRAMMAR* '(# # # ...))-19| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 31 62 DB DC 31 5A C6 19 01) + ((|COMMON-LISP|::|SPECIAL| |PAIP|::|*BIGGER-GRAMMAR*|) + |PAIP|::|*BIGGER-GRAMMAR*| + ((|PAIP|::|SENTENCE| (|PAIP|::|NOUN-PHRASE| |PAIP|::|VERB-PHRASE|)) + (|PAIP|::|NOUN-PHRASE| + (|PAIP|::|ARTICLE| |PAIP|::|ADJ*| |PAIP|::|NOUN| |PAIP|::|PP*|) + (|PAIP|::|NAME|) (|PAIP|::|PRONOUN|)) + (|PAIP|::|VERB-PHRASE| + (|PAIP|::|VERB| |PAIP|::|NOUN-PHRASE| |PAIP|::|PP*|)) + (|PAIP|::|PP*| |COMMON-LISP|::|NIL| (|PAIP|::|PP| |PAIP|::|PP*|)) + (|PAIP|::|ADJ*| |COMMON-LISP|::|NIL| (|PAIP|::|ADJ| |PAIP|::|ADJ*|)) + (|PAIP|::|PP| (|PAIP|::|PREP| |PAIP|::|NOUN-PHRASE|)) + (|PAIP|::|PREP| |PAIP|::|TO| |PAIP|::|IN| |PAIP|::|BY| |PAIP|::|WITH| + |PAIP|::|ON|) + (|PAIP|::|ADJ| |PAIP|::|BIG| |PAIP|::|LITTLE| |PAIP|::|BLUE| + |PAIP|::|GREEN| |PAIP|::|ADIABATIC|) + (|PAIP|::|ARTICLE| |COMMON-LISP|::|THE| |PAIP|::|A|) + (|PAIP|::|NAME| |PAIP|::|PAT| |PAIP|::|KIM| |PAIP|::|LEE| |PAIP|::|TERRY| + |PAIP|::|ROBIN|) + (|PAIP|::|NOUN| |PAIP|::|MAN| |PAIP|::|BALL| |PAIP|::|WOMAN| + |PAIP|::|TABLE|) + (|PAIP|::|VERB| |PAIP|::|HIT| |PAIP|::|TOOK| |PAIP|::|SAW| + |PAIP|::|LIKED|) + (|PAIP|::|PRONOUN| |PAIP|::|HE| |PAIP|::|SHE| |PAIP|::|IT| |PAIP|::|THESE| + |PAIP|::|THOSE| |PAIP|::|THAT|))) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|151 151 (SETF *GRAMMAR* *BIGGER-GRAMMAR*)-20| + #16Y(00 00 00 00 00 00 00 00 20 01 0E 00 0F 01 19 01) + (|PAIP|::|*BIGGER-GRAMMAR*| |PAIP|::|*GRAMMAR*|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|153 158 (DEFUN GENERATE-TREE (PHRASE) ...)-21| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|GENERATE-TREE| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|GENERATE-TREE| + #42Y(00 00 00 00 01 00 00 00 26 02 AD 8E 1D 09 AD 88 01 0D AD 61 01 19 + 02 99 00 AE 33 00 16 19 02 AD AE 6F 01 6F 02 28 63 5D 19 02) + (|PAIP|::|GENERATE-TREE| |PAIP|::|REWRITES| |PAIP|::|RANDOM-ELT|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|PHRASE|) + "Generate a random PHRASE, with a complete parse tree." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|160 168 (DEFUN GENERATE-ALL (PHRASE) ...)-22| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|GENERATE-ALL| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|GENERATE-ALL| + #56Y(00 00 00 00 01 00 00 00 26 02 92 01 1B 00 1B 23 94 01 6C 11 95 02 + 6C 0D 30 00 19 02 99 02 AE 6F 01 30 03 19 02 93 01 65 AD 8E 1D 64 + AD 88 01 6C AD 61 01 14 61 01 19 02) + (|PAIP|::|COMBINE-ALL| |PAIP|::|REWRITES| |PAIP|::|GENERATE-ALL| + |PAIP|::|MAPPEND|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|PHRASE|) + "Generate a list of all possible expansions of PHRASE." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|170 175 (DEFUN COMBINE-ALL (XLIST YLIST) ...)-23| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|COMBINE-ALL| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|COMBINE-ALL| + #18Y(00 00 00 00 02 00 00 00 26 03 DA AF AF 2D 03 01 19 03) + (#.#'|COMMON-LISP|::|APPEND| |PAIP|::|CROSS-PRODUCT|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|XLIST| |PAIP|::|YLIST|) + "Return a list of lists formed by appending a YLIST to an XLIST.\n\n +E.g., (combine-all '((a) (b)) '((1) (2)))\n + => ((A 1) (B 1) (A 2) (B 2))." + 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|177 189 (DEFUN CROSS-PRODUCT (FN AS BS) ...)-24| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|CROSS-PRODUCT| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|CROSS-PRODUCT| + #30Y(00 00 00 00 03 00 00 00 26 04 00 2B 02 7F 04 00 00 7F 03 00 01 AC + 6D 00 01 AF 30 01 19 05) + (#Y(|PAIP|::|CROSS-PRODUCT-1| + #42Y(00 00 00 00 01 00 00 00 26 02 63 69 00 02 1B 0F 94 00 69 00 01 + AD B2 76 02 84 02 16 01 83 00 AC 8D 9F 6D 16 01 AC 31 B1 19 03) + (|COMMON-LISP|::|NIL|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|B|) |COMMON-LISP|::|NIL| 1) + |PAIP|::|MAPPEND|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|FN| |PAIP|::|AS| |PAIP|::|BS|) + "Calculate the result of passing FN to the cross (or Cartesian) product of\n + lists of AS and BS." + 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) diff --git a/paip.lib b/paip.lib new file mode 100644 index 0000000..bc7ec97 --- /dev/null +++ b/paip.lib @@ -0,0 +1,47 @@ +#0Y_ #0Y |CHARSET|::|UTF-8| +(|COMMON-LISP|::|SETQ| |COMMON-LISP|::|*PACKAGE*| + (|SYSTEM|::|%FIND-PACKAGE| "PAIP")) +(|SYSTEM|::|C-PROCLAIM| '(|COMMON-LISP|::|SPECIAL| |PAIP|::|*TITLES*|)) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|FIRST-NAME| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|NAME|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|LAST-NAME| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|NAME|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|POWER| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|N| |PAIP|::|M|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|COUNT-ATOMS| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|EXPR|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|COUNT-ALL-ATOMS| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| + '(|PAIP|::|EXPR| |COMMON-LISP|::|&OPTIONAL| (|PAIP|::|IF-NULL| 1.)))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|COUNT-ANYWHERE| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| + '(|PAIP|::|OBJ| |PAIP|::|EXPR| |COMMON-LISP|::|&OPTIONAL| + (|PAIP|::|TEST| #'|COMMON-LISP|::|EQ|)))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|DOT-PRODUCT| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|LIST1| |PAIP|::|LIST2|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|MAPPEND| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|FN| |COMMON-LISP|::|LIST|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|ONE-OF| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|COMMON-LISP|::|SET|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|RANDOM-ELT| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|CHOICES|))) +(|SYSTEM|::|C-PROCLAIM| '(|COMMON-LISP|::|SPECIAL| |PAIP|::|*SIMPLE-GRAMMAR*|)) +(|SYSTEM|::|C-PROCLAIM| '(|COMMON-LISP|::|SPECIAL| |PAIP|::|*GRAMMAR*|)) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|RULE-LHS| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|RULE|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|RULE-RHS| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|RULE|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|REWRITES| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|CATEGORY|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|GENERATE| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|PHRASE|))) +(|SYSTEM|::|C-PROCLAIM| '(|COMMON-LISP|::|SPECIAL| |PAIP|::|*BIGGER-GRAMMAR*|)) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|GENERATE-TREE| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|PHRASE|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|GENERATE-ALL| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|PHRASE|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|COMBINE-ALL| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|XLIST| |PAIP|::|YLIST|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|CROSS-PRODUCT| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| + '(|PAIP|::|FN| |PAIP|::|AS| |PAIP|::|BS|))) diff --git a/paip.lisp b/paip.lisp index 903df9e..1e3434d 100644 --- a/paip.lisp +++ b/paip.lisp @@ -172,6 +172,21 @@ E.g., (combine-all '((a) (b)) '((1) (2))) => ((A 1) (B 1) (A 2) (B 2))." - (mappend #'(lambda (y) - (mapcar #'(lambda (x) (append x y)) xlist)) - ylist)) + (cross-product #'append xlist ylist)) + +;; Exercise 2.4 [m] One way of describing combine-all is that it calculates the +;; cross-product of the function append on the argument lists. Write the +;; higher-order function cross-product, and define combine-all in terms of it. +;; The moral is to make your code as general as possible, because you never +;; know what you may want to do with it next. +;; NOTE[acd]: it's the CARTESIAN product. + +(defun cross-product (fn as bs) + "Calculate the result of passing FN to the cross (or Cartesian) product of + lists of AS and BS." + (mappend #'(lambda (b) + (mapcar #'(lambda (a) (funcall fn a b)) as)) + bs)) + + +;;; Chapter 3 diff --git a/part-1.fas b/part-1.fas new file mode 100644 index 0000000..f6819e1 --- /dev/null +++ b/part-1.fas @@ -0,0 +1,384 @@ +(|SYSTEM|::|VERSION| '(20080430.)) +#0Y_ #0Y |CHARSET|::|UTF-8| +#Y(#:|1 3 (IN-PACKAGE #:PAIP)-1| + #17Y(00 00 00 00 00 00 00 00 20 01 DA 31 F6 0F 01 19 01) + ("PAIP" |COMMON-LISP|::|*PACKAGE*|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|6 11 (DEFPARAMETER *TITLES* '(MD SR. JR. ...) ...)-2| + #26Y(00 00 00 00 00 00 00 00 20 01 DA 31 62 DB DC 31 5A DB DD DE 2D 03 05 C6 + 19 01) + ((|COMMON-LISP|::|SPECIAL| |PAIP|::|*TITLES*|) |PAIP|::|*TITLES*| + (|PAIP|::|MD| |PAIP|::|SR.| |PAIP|::|JR.| |PAIP|::|SIR|) + |COMMON-LISP|::|VARIABLE| "Titles aren't part of names." + |SYSTEM|::|%SET-DOCUMENTATION|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|13 17 (DEFUN FIRST-NAME (NAME) ...)-3| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|FIRST-NAME| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|FIRST-NAME| + #29Y(00 00 00 00 01 00 00 00 26 02 94 01 6B 00 38 03 8C C1 04 9E 5B 19 + 02 95 01 29 01 03 6D) + (|PAIP|::|*TITLES*|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|NAME|) + "Select the first name from a NAME represented as a list." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|19 21 (DEFUN LAST-NAME (NAME) ...)-4| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|LAST-NAME| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|LAST-NAME| + #17Y(00 00 00 00 01 00 00 00 26 02 AD 72 63 2F 00 19 02) + (|PAIP|::|FIRST-NAME|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|NAME|) + "Select the last name from a NAME represented as a list." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|23 31 (DEFUN POWER (N M) ...)-5| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|POWER| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|POWER| + #37Y(00 00 00 00 02 00 00 00 26 03 AD 8E AC 11 AD DA 90 01 2F 0E AE AF + 97 03 6C 70 33 02 39 19 03 C5 19 03 9F 19 03) + (1.) (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|N| |PAIP|::|M|) "Raise N to an integer power M." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|33 44 (DEFUN COUNT-ATOMS (EXPR) ...)-6| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|COUNT-ATOMS| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|COUNT-ATOMS| + #38Y(00 00 00 00 01 00 00 00 26 02 92 01 09 C5 19 02 C6 19 02 93 01 77 + 9E 20 77 94 01 6C 76 95 02 6C 72 33 02 37 19 02) + (0. 1.) (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|EXPR|) "Count how many atoms are in EXPR, disregarding NIL." + 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|46 52 (DEFUN COUNT-ALL-ATOMS (EXPR &OPTIONAL #) ...)-7| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|COUNT-ALL-ATOMS| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|COUNT-ALL-ATOMS| + #45Y(00 00 00 00 01 00 01 00 26 08 3B 01 0B C5 F9 92 02 09 9E 19 03 C5 + 19 03 93 02 77 9F 20 77 94 02 DA 6C 67 95 03 DB 6C 62 33 02 37 19 + 03) + (1. 0.) (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|EXPR| |COMMON-LISP|::|&OPTIONAL| (|PAIP|::|IF-NULL| 1.)) + "Count all atoms in EXPR, including NILs only in non-tail position." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|54 64 (DEFUN COUNT-ANYWHERE (OBJ EXPR &OPTIONAL ...) ...)-8| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|COUNT-ANYWHERE| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|COUNT-ANYWHERE| + #57Y(00 00 00 00 02 00 01 00 26 09 3B 01 15 C5 F9 92 02 13 C6 19 04 C7 + 19 04 AD B0 B0 36 02 1C 76 C6 19 04 93 02 6D 9F 20 70 AF 94 03 AF + 6C 5C B0 95 04 B0 6C 56 33 02 37 19 04) + (#.#'|COMMON-LISP|::|EQ| 0. 1.) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|OBJ| |PAIP|::|EXPR| |COMMON-LISP|::|&OPTIONAL| + (|PAIP|::|TEST| #'|COMMON-LISP|::|EQ|)) + "Count how many times an OBJ appears anywhere in an EXPR." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|66 73 (DEFUN DOT-PRODUCT (LIST1 LIST2) ...)-9| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|DOT-PRODUCT| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|DOT-PRODUCT| + #20Y(00 00 00 00 02 00 00 00 26 03 DA DB B0 B0 33 01 16 9B 00 03) + (#.#'|COMMON-LISP|::|+| #.#'|COMMON-LISP|::|*|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|LIST1| |PAIP|::|LIST2|) + "Compute the dot product of LIST1 and LIST2" 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|76 80 (DEFUN MAPPEND (FN LIST) ...)-10| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|MAPPEND| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|MAPPEND| + #19Y(00 00 00 00 02 00 00 00 26 03 DA AF AF 33 00 16 9B 00 03) + (#.#'|COMMON-LISP|::|APPEND|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|FN| |COMMON-LISP|::|LIST|) + "Apply FN to each element of LIST and append the results." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|82 84 (DEFUN ONE-OF (SET) ...)-11| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|ONE-OF| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|ONE-OF| + #17Y(00 00 00 00 01 00 00 00 26 02 AD 6F 00 61 01 19 02) + (|PAIP|::|RANDOM-ELT|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|COMMON-LISP|::|SET|) "Pick one element of SET, and make a list of it." + 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|86 88 (DEFUN RANDOM-ELT (CHOICES) ...)-12| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|RANDOM-ELT| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|RANDOM-ELT| + #22Y(00 00 00 00 01 00 00 00 26 02 AD AE 72 62 38 01 72 F7 32 5E 19 02) + () (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|CHOICES|) "Choose a random element from list CHOICES." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|90 97 (DEFPARAMETER *SIMPLE-GRAMMAR* '(# # # ...) ...)-13| + #26Y(00 00 00 00 00 00 00 00 20 01 DA 31 62 DB DC 31 5A DB DD DE 2D 03 05 C6 + 19 01) + ((|COMMON-LISP|::|SPECIAL| |PAIP|::|*SIMPLE-GRAMMAR*|) + |PAIP|::|*SIMPLE-GRAMMAR*| + ((|PAIP|::|SENTENCE| (|PAIP|::|NOUN-PHRASE| |PAIP|::|VERB-PHRASE|)) + (|PAIP|::|NOUN-PHRASE| (|PAIP|::|ARTICLE| |PAIP|::|NOUN|)) + (|PAIP|::|VERB-PHRASE| (|PAIP|::|VERB| |PAIP|::|NOUN-PHRASE|)) + (|PAIP|::|ARTICLE| |COMMON-LISP|::|THE| |PAIP|::|A|) + (|PAIP|::|NOUN| |PAIP|::|MAN| |PAIP|::|BALL| |PAIP|::|WOMAN| + |PAIP|::|TABLE|) + (|PAIP|::|VERB| |PAIP|::|HIT| |PAIP|::|TOOK| |PAIP|::|SAW| + |PAIP|::|LIKED|)) + |COMMON-LISP|::|VARIABLE| "A grammar for a trivial subset of English." + |SYSTEM|::|%SET-DOCUMENTATION|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|99 100 (DEFVAR *GRAMMAR* *SIMPLE-GRAMMAR* ...)-14| + #31Y(00 00 00 00 00 00 00 00 20 01 DA 31 62 DB 8C 57 05 DB 6B 02 31 5A DB DD + DE 2D 03 05 C6 19 01) + ((|COMMON-LISP|::|SPECIAL| |PAIP|::|*GRAMMAR*|) |PAIP|::|*GRAMMAR*| + |PAIP|::|*SIMPLE-GRAMMAR*| |COMMON-LISP|::|VARIABLE| + "The grammar used by `generate'." |SYSTEM|::|%SET-DOCUMENTATION|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|102 104 (DEFUN RULE-LHS (RULE) ...)-15| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|RULE-LHS| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|RULE-LHS| #14Y(00 00 00 00 01 00 00 00 26 02 9E 5B 19 02) () + (|COMMON-LISP|::|T| |COMMON-LISP|::|NIL| |COMMON-LISP|::|NIL|) + (|PAIP|::|RULE|) "The left-hand side of a RULE." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|106 108 (DEFUN RULE-RHS (RULE) ...)-16| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|RULE-RHS| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|RULE-RHS| #14Y(00 00 00 00 01 00 00 00 26 02 9E 5C 19 02) () + (|COMMON-LISP|::|T| |COMMON-LISP|::|NIL| |COMMON-LISP|::|NIL|) + (|PAIP|::|RULE|) "The right-hand side of a RULE." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|110 112 (DEFUN REWRITES (CATEGORY) ...)-17| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|REWRITES| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|REWRITES| + #21Y(00 00 00 00 01 00 00 00 26 02 AD 6B 00 38 03 71 C8 2F 01 19 02) + (|PAIP|::|*GRAMMAR*| |PAIP|::|RULE-RHS|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|CATEGORY|) + "Return a list of the possible rewrites for CATEGORY." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|114 121 (DEFUN GENERATE (PHRASE) ...)-18| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|GENERATE| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|GENERATE| + #39Y(00 00 00 00 01 00 00 00 26 02 AD 6F 00 AE 8E 1D 08 92 00 0C AE 61 + 01 19 03 99 01 AF 30 02 19 03 14 6F 03 29 01 04 63) + (|PAIP|::|REWRITES| |PAIP|::|GENERATE| |PAIP|::|MAPPEND| + |PAIP|::|RANDOM-ELT|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|PHRASE|) "Generate a random LHS present in `*grammar*'." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|123 149 (DEFPARAMETER *BIGGER-GRAMMAR* '(# # # ...))-19| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 31 62 DB DC 31 5A C6 19 01) + ((|COMMON-LISP|::|SPECIAL| |PAIP|::|*BIGGER-GRAMMAR*|) + |PAIP|::|*BIGGER-GRAMMAR*| + ((|PAIP|::|SENTENCE| (|PAIP|::|NOUN-PHRASE| |PAIP|::|VERB-PHRASE|)) + (|PAIP|::|NOUN-PHRASE| + (|PAIP|::|ARTICLE| |PAIP|::|ADJ*| |PAIP|::|NOUN| |PAIP|::|PP*|) + (|PAIP|::|NAME|) (|PAIP|::|PRONOUN|)) + (|PAIP|::|VERB-PHRASE| + (|PAIP|::|VERB| |PAIP|::|NOUN-PHRASE| |PAIP|::|PP*|)) + (|PAIP|::|PP*| |COMMON-LISP|::|NIL| (|PAIP|::|PP| |PAIP|::|PP*|)) + (|PAIP|::|ADJ*| |COMMON-LISP|::|NIL| (|PAIP|::|ADJ| |PAIP|::|ADJ*|)) + (|PAIP|::|PP| (|PAIP|::|PREP| |PAIP|::|NOUN-PHRASE|)) + (|PAIP|::|PREP| |PAIP|::|TO| |PAIP|::|IN| |PAIP|::|BY| |PAIP|::|WITH| + |PAIP|::|ON|) + (|PAIP|::|ADJ| |PAIP|::|BIG| |PAIP|::|LITTLE| |PAIP|::|BLUE| + |PAIP|::|GREEN| |PAIP|::|ADIABATIC|) + (|PAIP|::|ARTICLE| |COMMON-LISP|::|THE| |PAIP|::|A|) + (|PAIP|::|NAME| |PAIP|::|PAT| |PAIP|::|KIM| |PAIP|::|LEE| |PAIP|::|TERRY| + |PAIP|::|ROBIN|) + (|PAIP|::|NOUN| |PAIP|::|MAN| |PAIP|::|BALL| |PAIP|::|WOMAN| + |PAIP|::|TABLE|) + (|PAIP|::|VERB| |PAIP|::|HIT| |PAIP|::|TOOK| |PAIP|::|SAW| + |PAIP|::|LIKED|) + (|PAIP|::|PRONOUN| |PAIP|::|HE| |PAIP|::|SHE| |PAIP|::|IT| |PAIP|::|THESE| + |PAIP|::|THOSE| |PAIP|::|THAT|))) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|151 151 (SETF *GRAMMAR* *BIGGER-GRAMMAR*)-20| + #16Y(00 00 00 00 00 00 00 00 20 01 0E 00 0F 01 19 01) + (|PAIP|::|*BIGGER-GRAMMAR*| |PAIP|::|*GRAMMAR*|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|153 158 (DEFUN GENERATE-TREE (PHRASE) ...)-21| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|GENERATE-TREE| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|GENERATE-TREE| + #42Y(00 00 00 00 01 00 00 00 26 02 AD 8E 1D 09 AD 88 01 0D AD 61 01 19 + 02 99 00 AE 33 00 16 19 02 AD AE 6F 01 6F 02 28 63 5D 19 02) + (|PAIP|::|GENERATE-TREE| |PAIP|::|REWRITES| |PAIP|::|RANDOM-ELT|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|PHRASE|) + "Generate a random PHRASE, with a complete parse tree." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|160 168 (DEFUN GENERATE-ALL (PHRASE) ...)-22| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|GENERATE-ALL| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|GENERATE-ALL| + #56Y(00 00 00 00 01 00 00 00 26 02 92 01 1B 00 1B 23 94 01 6C 11 95 02 + 6C 0D 30 00 19 02 99 02 AE 6F 01 30 03 19 02 93 01 65 AD 8E 1D 64 + AD 88 01 6C AD 61 01 14 61 01 19 02) + (|PAIP|::|COMBINE-ALL| |PAIP|::|REWRITES| |PAIP|::|GENERATE-ALL| + |PAIP|::|MAPPEND|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|PHRASE|) + "Generate a list of all possible expansions of PHRASE." 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|170 175 (DEFUN COMBINE-ALL (XLIST YLIST) ...)-23| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|COMBINE-ALL| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|COMBINE-ALL| + #18Y(00 00 00 00 02 00 00 00 26 03 DA AF AF 2D 03 01 19 03) + (#.#'|COMMON-LISP|::|APPEND| |PAIP|::|CROSS-PRODUCT|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|XLIST| |PAIP|::|YLIST|) + "Return a list of lists formed by appending a YLIST to an XLIST.\n\n +E.g., (combine-all '((a) (b)) '((1) (2)))\n + => ((A 1) (B 1) (A 2) (B 2))." + 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|177 189 (DEFUN CROSS-PRODUCT (FN AS BS) ...)-24| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|CROSS-PRODUCT| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|CROSS-PRODUCT| + #30Y(00 00 00 00 03 00 00 00 26 04 00 2B 02 7F 04 00 00 7F 03 00 01 AC + 6D 00 01 AF 30 01 19 05) + (#Y(|PAIP|::|CROSS-PRODUCT-1| + #42Y(00 00 00 00 01 00 00 00 26 02 63 69 00 02 1B 0F 94 00 69 00 01 + AD B2 76 02 84 02 16 01 83 00 AC 8D 9F 6D 16 01 AC 31 B1 19 03) + (|COMMON-LISP|::|NIL|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|B|) |COMMON-LISP|::|NIL| 1) + |PAIP|::|MAPPEND|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|FN| |PAIP|::|AS| |PAIP|::|BS|) + "Calculate the result of passing FN to the cross (or Cartesian) product of\n + lists of AS and BS." + 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|192 209 (DEFUN TEST-LET*-LAMBDA NIL ...)-25| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|TEST-LET*-LAMBDA| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|TEST-LET*-LAMBDA| + #34Y(00 00 00 00 00 00 00 00 26 01 DA DA 73 02 39 DA AD 82 02 37 00 DA + DA DA 73 02 39 73 02 37 61 02 19 01) + (6.) (|COMMON-LISP|::|NIL| |COMMON-LISP|::|NIL| |COMMON-LISP|::|NIL|) () + |COMMON-LISP|::|NIL| 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|211 217 (DEFUN LENGTH1 (LIST) ...)-26| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|LENGTH1| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|LENGTH1| + #27Y(00 00 00 00 01 00 00 00 26 02 DA AE 1B 04 85 01 83 00 AC 8D 9F 78 + 16 01 15 19 02) + (0.) (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|COMMON-LISP|::|LIST|) |COMMON-LISP|::|NIL| 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|219 222 (DEFUN LENGTH1.1 (LIST) ...)-27| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|LENGTH1.1| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|LENGTH1.1| + #25Y(00 00 00 00 01 00 00 00 26 02 DA AE 1B 04 85 01 83 00 AC 8D 9F 78 + 9E 19 04) + (0.) (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|COMMON-LISP|::|LIST|) |COMMON-LISP|::|NIL| 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|224 230 (DEFUN LENGTH2 (LIST) ...)-28| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|LENGTH2| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|LENGTH2| + #31Y(00 00 00 00 01 00 00 00 26 02 DA AE 1B 08 94 00 85 02 16 01 83 00 + AC 8D 9F 74 16 01 15 19 02) + (0.) (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|COMMON-LISP|::|LIST|) |COMMON-LISP|::|NIL| 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|232 235 (DEFUN LENGTH3 (LIST) ...)-29| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|LENGTH3| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|LENGTH3| + #25Y(00 00 00 00 01 00 00 00 26 02 DA AE 93 00 07 83 00 85 01 92 00 79 + 9E 19 04) + (0.) (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|COMMON-LISP|::|LIST|) |COMMON-LISP|::|NIL| 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|237 239 (DEFUN LENGTH4 (LIST) ...)-30| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|LENGTH4| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|LENGTH4| + #25Y(00 00 00 00 01 00 00 00 26 02 AD DA 1B 04 85 00 83 01 AD 8D 9F 78 + 15 19 03) + (0.) (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|COMMON-LISP|::|LIST|) |COMMON-LISP|::|NIL| 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|241 243 (DEFUN LENGTH4.1 (LIST) ...)-31| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|LENGTH4.1| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|LENGTH4.1| + #25Y(00 00 00 00 01 00 00 00 26 02 AD DA 1B 04 85 00 83 01 AD 8D 9F 78 + 15 19 03) + (0.) (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|COMMON-LISP|::|LIST|) |COMMON-LISP|::|NIL| 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|245 250 (DEFUN LENGTH4.2 (LIST) ...)-32| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|LENGTH4.2| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|LENGTH4.2| + #36Y(00 00 00 00 01 00 00 00 26 02 63 94 02 83 03 16 01 C5 F8 93 02 0B + 85 00 94 02 83 03 16 01 92 02 75 15 19 02) + (0.) (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|COMMON-LISP|::|LIST|) |COMMON-LISP|::|NIL| 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|252 253 (DEFUN LENGTH5 (LIST) ...)-33| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|LENGTH5| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|LENGTH5| + #19Y(00 00 00 00 01 00 00 00 26 02 99 00 AE 38 04 32 7E 19 02) + (|PAIP|::|TRUE|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|COMMON-LISP|::|LIST|) |COMMON-LISP|::|NIL| 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|255 257 (DEFUN TRUE (X) ...)-34| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|TRUE| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|TRUE| #13Y(00 00 00 00 01 00 00 00 26 02 02 19 02) () + |COMMON-LISP|::|NIL| (|PAIP|::|X|) |COMMON-LISP|::|NIL| 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|259 263 (DEFUN LENGTH6 (LIST) ...)-35| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|LENGTH6| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|LENGTH6| + #28Y(00 00 00 00 01 00 00 00 26 02 93 01 0C 99 01 AE 64 38 03 72 7B 32 + B1 19 02 C5 19 02) + (0. |PAIP|::|TRUE|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|COMMON-LISP|::|LIST|) |COMMON-LISP|::|NIL| 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|265 268 (DEFUN LENGTH7 (LIST) ...)-36| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|LENGTH7| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|LENGTH7| + #27Y(00 00 00 00 01 00 00 00 26 02 92 01 06 C5 19 02 93 01 7A 95 01 6C + 79 32 B1 19 02) + (0.) (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|COMMON-LISP|::|LIST|) |COMMON-LISP|::|NIL| 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|270 271 (DEFUN LENGTH8 (LIST) ...)-37| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|LENGTH8| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|LENGTH8| #16Y(00 00 00 00 01 00 00 00 26 02 AD DA 30 01 19 02) + (0. |PAIP|::|LENGTH8-AUX|) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|COMMON-LISP|::|LIST|) |COMMON-LISP|::|NIL| 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) +#Y(#:|273 276 (DEFUN LENGTH8-AUX (SUBLIST LEN-SO-FAR) ...)-38| + #20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01) + (|PAIP|::|LENGTH8-AUX| |SYSTEM|::|REMOVE-OLD-DEFINITIONS| + #Y(|PAIP|::|LENGTH8-AUX| + #27Y(00 00 00 00 02 00 00 00 26 03 92 02 06 9E 19 03 93 02 7A 95 02 96 + 02 29 02 05 75) + () (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|) + (|PAIP|::|SUBLIST| |PAIP|::|LEN-SO-FAR|) |COMMON-LISP|::|NIL| 1)) + (|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|)) diff --git a/part-1.lib b/part-1.lib new file mode 100644 index 0000000..3e7e13f --- /dev/null +++ b/part-1.lib @@ -0,0 +1,76 @@ +#0Y_ #0Y |CHARSET|::|UTF-8| +(|COMMON-LISP|::|SETQ| |COMMON-LISP|::|*PACKAGE*| + (|SYSTEM|::|%FIND-PACKAGE| "PAIP")) +(|SYSTEM|::|C-PROCLAIM| '(|COMMON-LISP|::|SPECIAL| |PAIP|::|*TITLES*|)) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|FIRST-NAME| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|NAME|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|LAST-NAME| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|NAME|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|POWER| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|N| |PAIP|::|M|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|COUNT-ATOMS| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|EXPR|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|COUNT-ALL-ATOMS| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| + '(|PAIP|::|EXPR| |COMMON-LISP|::|&OPTIONAL| (|PAIP|::|IF-NULL| 1.)))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|COUNT-ANYWHERE| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| + '(|PAIP|::|OBJ| |PAIP|::|EXPR| |COMMON-LISP|::|&OPTIONAL| + (|PAIP|::|TEST| #'|COMMON-LISP|::|EQ|)))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|DOT-PRODUCT| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|LIST1| |PAIP|::|LIST2|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|MAPPEND| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|FN| |COMMON-LISP|::|LIST|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|ONE-OF| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|COMMON-LISP|::|SET|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|RANDOM-ELT| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|CHOICES|))) +(|SYSTEM|::|C-PROCLAIM| '(|COMMON-LISP|::|SPECIAL| |PAIP|::|*SIMPLE-GRAMMAR*|)) +(|SYSTEM|::|C-PROCLAIM| '(|COMMON-LISP|::|SPECIAL| |PAIP|::|*GRAMMAR*|)) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|RULE-LHS| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|RULE|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|RULE-RHS| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|RULE|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|REWRITES| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|CATEGORY|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|GENERATE| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|PHRASE|))) +(|SYSTEM|::|C-PROCLAIM| '(|COMMON-LISP|::|SPECIAL| |PAIP|::|*BIGGER-GRAMMAR*|)) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|GENERATE-TREE| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|PHRASE|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|GENERATE-ALL| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|PHRASE|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|COMBINE-ALL| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|XLIST| |PAIP|::|YLIST|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|CROSS-PRODUCT| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| + '(|PAIP|::|FN| |PAIP|::|AS| |PAIP|::|BS|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|TEST-LET*-LAMBDA| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '|COMMON-LISP|::|NIL|)) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|LENGTH1| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|COMMON-LISP|::|LIST|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|LENGTH1.1| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|COMMON-LISP|::|LIST|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|LENGTH2| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|COMMON-LISP|::|LIST|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|LENGTH3| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|COMMON-LISP|::|LIST|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|LENGTH4| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|COMMON-LISP|::|LIST|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|LENGTH4.1| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|COMMON-LISP|::|LIST|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|LENGTH4.2| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|COMMON-LISP|::|LIST|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|LENGTH5| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|COMMON-LISP|::|LIST|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|TRUE| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|PAIP|::|X|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|LENGTH6| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|COMMON-LISP|::|LIST|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|LENGTH7| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|COMMON-LISP|::|LIST|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|LENGTH8| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| '(|COMMON-LISP|::|LIST|))) +(|SYSTEM|::|C-DEFUN| '|PAIP|::|LENGTH8-AUX| + (|SYSTEM|::|LAMBDA-LIST-TO-SIGNATURE| + '(|PAIP|::|SUBLIST| |PAIP|::|LEN-SO-FAR|))) diff --git a/part-1.lisp b/part-1.lisp new file mode 100644 index 0000000..50a64f1 --- /dev/null +++ b/part-1.lisp @@ -0,0 +1,302 @@ +;;;; paip.lisp + +(in-package #:paip) + + +;;; Chapter 1 + +;; 1.1 define a version of `last-name' that handles "Rex Morgan MD," "Morton +;; Downey, Jr.," etc. +(defparameter *titles* '(MD Sr. Jr. Sir) + "Titles aren't part of names.") + +(defun first-name (name) + "Select the first name from a NAME represented as a list." + (if (member (first name) *titles*) + (first-name (rest name)) + (first name))) + +(defun last-name (name) + "Select the last name from a NAME represented as a list." + (first-name (reverse name))) + +;; 1.2 Write a function to exponentiate, or raise a number to an integer +;; power. For example: (power 3 2) = 3 ^ 2 = 9. + +(defun power (n m) + "Raise N to an integer power M." + (cond + ((= m 0) 1) + ((= m 1) n) + (t (* n (power n (- m 1)))))) + +;; 1.3 Write a function that counts the number of atoms in an expression. For +;; example: (count-atoms '(a (b) c)) = 3. Notice that there is something of an +;; ambiguity in this: shoul (a nil c) count as 3 atoms, or as two, because it's +;; the equivalent to (a () c) ? + +(defun count-atoms (expr) + "Count how many atoms are in EXPR, disregarding NIL." + (cond + ((null expr) 0) + ((atom expr) 1) + (t (+ (count-atoms (first expr)) + (count-atoms (rest expr)))))) + +(defun count-all-atoms (expr &optional (if-null 1)) + "Count all atoms in EXPR, including NILs only in non-tail position." + (cond + ((null expr) if-null) + ((atom expr) 1) + (t (+ (count-all-atoms (first expr) 1) + (count-all-atoms (rest expr) 0))))) + +;; 1.4 Write a function that counts the number of times an expression occurs +;; anywhere in another expression. Example: (count-anywhere 'a '(a ((a) b) a)) +;; => 3. + +(defun count-anywhere (obj expr &optional (test #'eq)) + "Count how many times an OBJ appears anywhere in an EXPR." + (cond + ((null expr) 0) + ((atom expr) (if (funcall test obj expr) 1 0)) + (t (+ (count-anywhere obj (first expr) test) + (count-anywhere obj (rest expr) test))))) + +;; Exercise 1.5 [m] Write a function to compute the dot product of two +;; sequences of numbers, represented as lists. The dot product is computed by +;; multiplying corresponding elements and then adding up the resulting +;; products. Example: (dot-product '(10 20) '(3 4)) = 10 × 3 + 20 × 4 = 110 + +(defun dot-product (list1 list2) + "Compute the dot product of LIST1 and LIST2" + (apply #'+ (mapcar #'* list1 list2))) + + +;;; Chapter 2 + +(defun mappend (fn list) + "Apply FN to each element of LIST and append the results." + (apply #'append (mapcar fn list))) + +(defun one-of (set) + "Pick one element of SET, and make a list of it." + (list (random-elt set))) + +(defun random-elt (choices) + "Choose a random element from list CHOICES." + (elt choices (random (length choices)))) + +(defparameter *simple-grammar* + '((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)) + "A grammar for a trivial subset of English.") + +(defvar *grammar* *simple-grammar* + "The grammar used by `generate'.") + +(defun rule-lhs (rule) + "The left-hand side of a RULE." + (first rule)) + +(defun rule-rhs (rule) + "The right-hand side of a RULE." + (rest rule)) + +(defun rewrites (category) + "Return a list of the possible rewrites for CATEGORY." + (rule-rhs (assoc category *grammar*))) + +;; 2.1. Write a version of `generate' that uses `cond' but avoids calling +;; `rewrites' twice. +(defun generate (phrase) + "Generate a random LHS present in `*grammar*'." + (let ((rw-list (rewrites phrase))) + (cond ((listp phrase) (mappend #'generate phrase)) + (rw-list (generate (random-elt rw-list))) + (t (list phrase))))) + +;; 2.2. Write a version of `generate' that explicitly differentiates between +;; terminal symbols (those with no rewrite rules) and nonterminal symbols. + +;; I'm gonna be honest, this one is tougher. I'm going to let it sit a minute. +;; (defun generate2 (phrase) +;; (let ((rw-list (rewrites phrase))) +;; (if rw-list +;; (let ((relt (random-elt rw-list))) +;; (if (listp relt) +;; (mappend #'generate2 phrase) +;; (generate2 relt))) +;; (list phrase)))) + +(defparameter *bigger-grammar* + '((sentence (noun-phrase verb-phrase)) + (noun-phrase (Article Adj* Noun PP*) (Name) (Pronoun)) + (verb-phrase (Verb noun-phrase PP*)) + (PP* () (PP PP*)) + (Adj* () (Adj Adj*)) + (PP (Prep noun-phrase)) + (Prep to in by with on) + (Adj big little blue green adiabatic) + (Article the a) + (Name Pat Kim Lee Terry Robin) + (Noun man ball woman table) + (Verb hit took saw liked) + (Pronoun he she it these those that))) + +(setf *grammar* *bigger-grammar*) + +(defun generate-tree (phrase) + "Generate a random PHRASE, with a complete parse tree." + (cond ((listp phrase) (mapcar #'generate-tree phrase)) + ((rewrites phrase) (cons phrase + (generate-tree (random-elt (rewrites phrase))))) + (t (list phrase)))) + +(defun generate-all (phrase) + "Generate a list of all possible expansions of PHRASE." + (cond ((null phrase) (list nil)) + ((listp phrase) + (combine-all (generate-all (first phrase)) + (generate-all (rest phrase)))) + ((rewrites phrase) + (mappend #'generate-all (rewrites phrase))) + (t (list (list phrase))))) + +(defun combine-all (xlist ylist) + "Return a list of lists formed by appending a YLIST to an XLIST. + +E.g., (combine-all '((a) (b)) '((1) (2))) + => ((A 1) (B 1) (A 2) (B 2))." + (cross-product #'append xlist ylist)) + +;; Exercise 2.4 [m] One way of describing combine-all is that it calculates the +;; cross-product of the function append on the argument lists. Write the +;; higher-order function cross-product, and define combine-all in terms of it. +;; The moral is to make your code as general as possible, because you never +;; know what you may want to do with it next. +;; NOTE[acd]: it's the CARTESIAN product. + +(defun cross-product (fn as bs) + "Calculate the result of passing FN to the cross (or Cartesian) product of + lists of AS and BS." + (mappend #'(lambda (b) + (mapcar #'(lambda (a) (funcall fn a b)) as)) + bs)) + + +;;; Chapter 3 + +;; Exercise 3.1 [m] Show a lambda expression that is equivalent to the below +;; let* expression. You may need more than one lambda. +;; (let* ((x 6) +;; (y (* x x))) +;; (+ x y)) => 42 + +(defun test-let*-lambda () + (list + ;; let* expression + (let* ((x 6) + (y (* x x))) + (+ x y)) + ;; lambda expression + ((lambda (x) + (+ x ((lambda (y) (* y y)) x))) + 6))) + +;; Various forms of length using different looping structures + +(defun length1 (list) + (let ((len 0)) + (dolist (element list) + (incf len)) + len)) + +(defun length1.1 (list) + (let ((len 0)) + (dolist (element list len) + (incf len)))) + +(defun length2 (list) + (let ((len 0)) + (mapc #'(lambda (element) + (declare (ignore element)) + (incf len)) + list) + len)) + +(defun length3 (list) + (do ((len 0 (+ len 1)) + (l list (rest l))) + ((null l) len))) + +(defun length4 (list) + (loop :for element :in list + :count t)) + +(defun length4.1 (list) + (loop :for element :in list + :summing 1)) + +(defun length4.2 (list) + (loop :for element := (pop list) + :with len := 0 + :until (null list) + :do (incf len) + :finally (return len))) + +(defun length5 (list) + (count-if #'true list)) + +(defun true (x) + (declare (ignore x)) + t) + +;; not the most straightforward ;P +(defun length6 (list) + (if (null list) + 0 + (+ 1 (position-if #'true list :from-end t)))) + +;; NOT TAIL RECURSIVE -- length7 calls itself, then adds 1, then returns +(defun length7 (list) + (if (null list) + 0 + (+ 1 (length7 (rest list))))) + +;; TAIL RECURSIVE -- length8-aux calls itself LAST +(defun length8 (list) + (length8-aux list 0)) + +(defun length8-aux (sublist len-so-far) + (if (null sublist) + len-so-far + (length8-aux (rest sublist) (+ 1 len-so-far)))) + +;; other options to avoid 2 functions +(defun length8-optional (list &optional (len-so-far 0)) + (if (null list) + len-so-far + (length8-optional (rest list) (+ 1 len-so-far)))) + +(defun length8-labels (list) + (labels ((length8-inside-label (the-list len-so-far) + (if (null the-list) + len-so-far + (length8-inside-label (rest the-list) (+ 1 len-so-far))))) + (length8-inside-label list 0))) + +;; example of RETURN special form +;; `dolist' has an implicit `block' form that `return' returns to +(defun product (numbers) + "Multiply all the numbers together to compute their product." + (let ((prod 1)) + (dolist (n numbers prod) + (format t "~a ~a~%" n prod) + (if (= n 0) + (return 0) + (setf prod (* n prod)))))) diff --git a/part-2.lisp b/part-2.lisp new file mode 100644 index 0000000..b1acfc7 --- /dev/null +++ b/part-2.lisp @@ -0,0 +1,3 @@ +;;; part-2 + +(in-package :paip) diff --git a/part-3.lisp b/part-3.lisp new file mode 100644 index 0000000..46adf2f --- /dev/null +++ b/part-3.lisp @@ -0,0 +1,3 @@ +;;; part-3.lisp + +(in-package :paip) diff --git a/part-4.lisp b/part-4.lisp new file mode 100644 index 0000000..86be9aa --- /dev/null +++ b/part-4.lisp @@ -0,0 +1,3 @@ +;;; part-4 + +(in-package :paip) diff --git a/part-5.lisp b/part-5.lisp new file mode 100644 index 0000000..e0a5d84 --- /dev/null +++ b/part-5.lisp @@ -0,0 +1,3 @@ +;;; part-5 + +(in-package :paip)