commit bd57a47827aec2fa7b95b022d44916135c3651ec Author: Kyle Isom Date: Fri Jun 1 00:15:10 2018 -0700 Initial import. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2f78cf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.pyc + diff --git a/README.md b/README.md new file mode 100644 index 0000000..8e4986d --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +## AQE: A Query Engine + +This is an implementation of a knowledge base, hacked together in Python +3 (it won't work in Python 2 for reasons of modules) for now to quickly +iterate on ideas. + +There are a few key points: + ++ A `KnowledgeBase` contains facts. ++ A fact is a tuple: (relationship, subject, object). For example, + `('is', 'sky', 'blue')`. ++ A `KnowledgeBase` has three core methods: ask, retract, and tell. ++ The `ask` method queries the `KnowledgeBase` to ascertain whether + a fact is true. Either the subject or the object may be `None`, + in which case all satisifiable facts are returned. ++ The `retract` method tells the `KnowledgeBase` that the fact is + no longer true. If it's rainy, we might retract our fact about the + sky being blue. ++ The `tell` method tells the `KnowledgeBase` that the fact is + now true. For example, if it's rainy (and we've retracted the previous + 'sky is blue' fact), we might tell the `KnowledgeBase` that + `('is', 'sky', 'grey')`. ++ A `KnowledgeBase` can also perform substitutions. ++ An action contains positive and negative preconditions, retractions, + and updates. The positive condition list contains facts that must + be true for a knowledge base, and the negative condition list contains + facts that must be false. If these preconditions hold, the retractions + are applied, followed by the updates. ++ See `test_actions.py` for an example. + +### Limitations + ++ Singleton facts aren't supported; that is, there is no way to make a + `KnowledgeBase` assert that there is only one relationship → subject + mapping. For example, the `KnowledgeBase` will admit that + `('is', 'shrödingers cat', 'alive')` and + `('is', 'schrödingers cat', 'dead') are both true simultaneously. + +### TODO + ++ Rewrite in C++? diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/actions.py b/actions.py new file mode 100644 index 0000000..66ec694 --- /dev/null +++ b/actions.py @@ -0,0 +1,33 @@ +import copy +import logging + +class Action: + + def __init__(self, pos_precond, neg_precond, retracts, updates): + self.pos_precond = copy.deepcopy(pos_precond) + self.neg_precond = copy.deepcopy(neg_precond) + self.retracts = copy.deepcopy(retracts) + self.updates = copy.deepcopy(updates) + + def satisfied(self, kb, subject, obj): + for fact in self.pos_precond: + if not kb.ask(kb.subst(fact, subject, obj)): + logging.warning('{} is not valid in the current knowledgebase'.format(fact)) + return False + + for fact in self.neg_precond: + if kb.ask(kb.subst(fact, subject, obj)): + logging.warning('{} is valid in the current knowledgebase'.format(fact)) + return False + return True + + def perform(self, kb, subject, obj): + if not self.satisfied(kb, subject, obj): + return None + kbprime = copy.deepcopy(kb) + for retraction in self.retracts: + kbprime.retract(kb.subst(retraction, subject, obj)) + for update in self.updates: + kbprime.tell(kb.subst(update, subject, obj)) + return kbprime + diff --git a/data/corpus.json b/data/corpus.json new file mode 100644 index 0000000..56a818a --- /dev/null +++ b/data/corpus.json @@ -0,0 +1 @@ +{"nouns": ["clerk", "horror", "gearshift", "permit", "witch-hunt", "convert", "negotiation", "boat-building", "balloon", "broom", "dew", "poem", "sick", "song", "accelerator", "sunbeam", "banana", "pass", "cookie", "disarmament", "spread", "step-grandmother", "subcomponent", "lemur", "debt", "suv", "eyeglasses", "azimuth", "ginseng", "dungeon", "lotion", "tinkle", "wombat", "scratch", "cashier", "ex-wife", "terracotta", "wrestler", "earmuffs", "pastoralist", "god", "chairperson", "log", "museum", "stove", "skyscraper", "scorn", "carbon", "code", "door", "ask", "desk", "soil", "cheetah", "advancement", "pain", "buggy", "cornet", "skullduggery", "resource", "freeze", "toilet", "tulip", "half-brother", "ironclad", "pail", "fiber", "powder", "wallet", "crash", "crayon", "crystallography", "cockpit", "reaction", "staircase", "vein", "estrogen", "adjustment", "feel", "exit", "grief", "layer", "angstrom", "livestock", "attention", "opinion", "ruth", "silkworm", "virginal", "brook", "tie", "rough", "overcoat", "spy", "writing", "hamster", "condor", "geese", "thrush", "futon", "union", "emphasis", "poultry", "radish", "soda", "congressperson", "villa", "synergy", "freckle", "brother", "kangaroo", "shortage", "abuse", "pan", "transom", "shell", "manicure", "police", "fifth", "ferry", "guilt", "piccolo", "spark", "bike", "catsup", "cod", "century", "toot", "leash", "pressurisation", "can", "sideboard", "sheath", "authorization", "barge", "grandfather", "radio", "egg", "mini", "daybed", "moth", "poncho", "reef", "surgeon", "ceramic", "cast", "hippopotamus", "phone", "sphere", "supporter", "whip", "derrick", "cultivator", "vehicle", "pantyhose", "work", "pantology", "picture", "chap", "moustache", "minor", "quill", "discussion", "in-joke", "strength", "overexertion", "dead", "patriot", "steal", "deficit", "education", "kazoo", "rage", "footnote", "page", "owl", "force", "pajama", "jodhpurs", "tic", "pinstripe", "lip", "plume", "snorer", "alcohol", "wannabe", "waterfall", "poetry", "chronometer", "pot", "source", "george", "construction", "softening", "gutter", "rooster", "hexagon", "hurt", "cupcake", "chip", "depressive", "gate", "neat", "copyright", "secret", "lamb", "cockroach", "garage", "rum", "symmetry", "management", "clavier", "confirmation", "salary", "kitten", "pendant", "town", "author", "baboon", "conversation", "lily", "peach", "segment", "subject", "netsuke", "harbor", "market", "tailspin", "insurance", "capital", "misreading", "distributor", "pound", "glass", "chin", "round", "sideburns", "loggia", "glut", "boxspring", "concentrate", "cough", "belly", "curio", "grandson", "massage", "producer", "pastry", "red", "tennis", "elevator", "history", "territory", "twister", "event", "pantsuit", "partridge", "bumper", "prize", "squash", "punishment", "faith", "grab", "dear", "shake", "stroke", "handball", "thigh", "tub", "rope", "interaction", "chief", "respond", "engineering", "beet", "process", "alpenglow", "cursor", "man", "open", "chopstick", "scanner", "estate", "mouth", "outside", "particular", "teach", "counter", "sad", "anorak", "therapist", "resolution", "utensil", "dinghy", "psychoanalyst", "kettle", "shoes", "apparatus", "fuel", "riddle", "weakness", "eel", "worker", "language", "marriage", "program", "domain", "tom", "stream", "beam", "suede", "turban", "paperback", "passion", "brilliant", "cave", "bunch", "bonsai", "crab", "interviewer", "feedback", "runner", "resort", "sonnet", "alloy", "sabre", "antler", "data", "middleman", "tugboat", "salmon", "tone", "spandex", "insolence", "scene", "humor", "cirrus", "stamen", "cereal", "emotion", "joey", "justice", "cleaner", "bake", "rainmaker", "pastor", "doorpost", "function", "laugh", "guestbook", "currency", "pimple", "deep", "multimedia", "rugby", "appeal", "action", "anxiety", "arrival", "sale", "climate", "wilderness", "responsibility", "zebrafish", "case", "forum", "baritone", "royal", "scissors", "cucumber", "present", "fundraising", "melody", "sandwich", "barometer", "discipline", "document", "tip", "lobotomy", "pitching", "effect", "progress", "sidestream", "sweet", "plough", "slippers", "fresco", "salesman", "sage", "wad", "screwdriver", "attendant", "scimitar", "bit", "switchboard", "drag", "strap", "kiosk", "windshield", "cinema", "fame", "equivalent", "title", "inlay", "web", "dark", "current", "badger", "tear", "stew", "point", "kidneys", "albatross", "congressman", "breast", "paw", "afterthought", "carpet", "tremor", "diadem", "pegboard", "nurture", "miscarriage", "gerbil", "patriarch", "lumberman", "storey", "suppression", "cross", "ankle", "dollar", "range", "thunderstorm", "chromolithograph", "crack", "astrology", "excitement", "tale", "whisker", "cracker", "eyelashes", "dibble", "fighter", "flash", "disaster", "indigence", "pavilion", "mantua", "mathematics", "son", "tight", "pantologist", "priesthood", "ovary", "injustice", "begonia", "chainstay", "columnist", "probation", "pearl", "vestment", "finisher", "pantry", "cherries", "aardvark", "user", "mansard", "rear", "smog", "interferometer", "deformation", "sail", "shopping", "foundation", "handmaiden", "metallurgist", "congress", "kick", "light", "locket", "formal", "midline", "pentagon", "bafflement", "tracksuit", "nephew", "rainstorm", "sow", "tuba", "front", "low", "fishmonger", "frame", "report", "election", "taste", "frog", "host", "pruner", "time", "swallow", "ideal", "ladder", "many", "boatyard", "ordinary", "temp", "orchid", "clothes", "atrium", "mocha", "lack", "rocket", "apse", "flatboat", "sari", "graph", "booklet", "bottle", "cop-out", "maid", "gun", "hide", "minibus", "spelling", "file", "lab", "shearling", "oxford", "wake", "ash", "officer", "sustainment", "ear", "element", "banker", "book", "drill", "happiness", "city", "bulb", "insect", "motor", "napkin", "pilgrimage", "reinscription", "prison", "cadet", "mandarin", "determination", "initial", "outset", "men", "knot", "chart", "crayfish", "skiing", "foot", "heel", "pin", "respect", "joy", "rowboat", "unique", "mortgage", "weird", "chest", "cartload", "nudge", "council", "dump", "headlight", "reality", "cat", "visor", "beverage", "advice", "biplane", "wound", "nursery", "advertising", "oyster", "curl", "archer", "clam", "knowledge", "strain", "revolver", "hydrofoil", "screw-up", "entertainment", "baker", "quality", "reply", "inscription", "chino", "lift", "cutover", "definition", "scraper", "captain", "catch", "map", "workshop", "barium", "lunch", "swim", "calculus", "fix", "national", "tray", "misfit", "poignance", "chrome", "dungarees", "mansion", "tune-up", "lunge", "stretch", "locker", "junket", "overflight", "dancer", "canon", "archaeology", "make", "tackle", "withdrawal", "pupa", "geology", "nicety", "store", "flip-flops", "afternoon", "corridor", "wraparound", "nightgown", "chasuble", "mug", "principle", "pneumonia", "verdict", "battle", "poet", "loneliness", "carload", "father-in-law", "birdbath", "craft", "faculty", "cymbals", "freighter", "membership", "equipment", "partner", "crocus", "will", "bowling", "translation", "offer", "loft", "catamaran", "youth", "kimono", "adapter", "driveway", "sorrow", "pike", "annual", "discount", "excuse", "savings", "platinum", "wear", "judgment", "megaliac", "crest", "bottom", "home", "premier", "windage", "hatbox", "policeman", "osmosis", "lock", "muscle", "apartment", "sculpting", "tenement", "checkroom", "cylinder", "diving", "saw", "comprehension", "marble", "hippodrome", "train", "fixture", "smoking", "truth", "application", "pencil", "behest", "shovel", "knee", "sister", "van", "patina", "anagram", "ikebana", "doe", "keyboarding", "toga", "west", "ethics", "friend", "bronchitis", "pinecone", "mandolin", "mover", "shin", "leprosy", "priest", "bail", "ink", "convection", "impression", "kick-off", "sherry", "potato", "yoke", "wastebasket", "science", "cappelletti", "leek", "read", "attachment", "handsaw", "cold", "aquifer", "fun", "drawer", "factor", "representative", "lasagna", "stable", "yawl", "agreement", "virus", "sunroom", "bassinet", "teeth", "hardhat", "angiosperm", "kite", "concert", "concept", "sarong", "walnut", "burst", "economics", "hearing", "lever", "peripheral", "hugger", "purchase", "timpani", "timber", "brood", "architect", "atelier", "chub", "cover", "full", "gumshoes", "score", "cello", "emu", "humidity", "obi", "subroutine", "overshoot", "heater", "squid", "underpants", "mister", "kill", "inbox", "sense", "fascia", "newspaper", "temporariness", "falling-out", "gondola", "raincoat", "cocoa", "maracas", "tolerance", "blueberry", "octet", "bracket", "pipe", "charity", "garlic", "hole", "message", "port", "relish", "stranger", "weedkiller", "moat", "sewer", "destroyer", "fowl", "birch", "interactive", "reamer", "verse", "klomps", "musculature", "spruce", "head", "acoustics", "scooter", "treat", "diaphragm", "high-rise", "age", "coliseum", "human", "solid", "package", "sack", "disgust", "clasp", "finger", "produce", "sailboat", "caption", "hit", "jacket", "periodical", "sprout", "forebear", "cotton", "luck", "tiger", "doubling", "cuff-links", "apology", "seal", "subconscious", "patch", "hot", "tuxedo", "burn-out", "physical", "recording", "chill", "waterskiing", "drink", "mother-in-law", "twilight", "two", "icecream", "makeup", "pickax", "sultan", "classroom", "feet", "eggnog", "bather", "bun", "expert", "discrepancy", "opportunist", "skill", "upstairs", "cauliflower", "peen", "position", "game", "coast", "variation", "addiction", "learning", "meter", "astronomy", "yeast", "gray", "mastication", "tintype", "bomb", "select", "surfboard", "alpaca", "ram", "dash", "yak", "mariachi", "batting", "observation", "mare", "random", "councilman", "pilot", "plow", "charles", "mate", "tissue", "pet", "league", "drug", "tooth", "tripod", "manhunt", "kendo", "literature", "split", "berry", "scallion", "imagination", "creche", "garden", "verve", "earrings", "profession", "congo", "date", "dare", "fort", "postage", "housework", "temper", "zone", "estuary", "brake", "frustration", "infusion", "parent", "mimosa", "kiss", "inventory", "tam-o'-shanter", "winner", "possible", "shallot", "necktie", "whereas", "cycle", "naming", "opportunity", "wetsuit", "curtain", "salad", "voyage", "deal", "bay", "arch", "judge", "scarf", "crow", "throne", "pusher", "pair", "rubbish", "housing", "investment", "shack", "typhoon", "nanoparticle", "nickel", "worry", "storm", "fork", "perfume", "attitude", "giraffe", "ride", "rule", "steamroller", "stick", "thongs", "castle", "sky", "smuggling", "turn", "increase", "smash", "beyond", "golf", "dolphin", "path", "worm", "care", "jockey", "abbey", "ketch", "fisherman", "survey", "middle", "invite", "objective", "warning", "oil", "revenant", "lunchroom", "princess", "matter", "lamp", "edger", "mantle", "rate", "visit", "inflation", "interior", "comb", "goose", "weekend", "zebra", "response", "wool", "bidet", "hardware", "digital", "guitar", "shift", "diet", "sweater", "mower", "card", "parka", "velvet", "assistance", "hearth", "honey", "raw", "article", "footstool", "airline", "paste", "harmonica", "oval", "allergist", "independent", "insurgence", "bandolier", "keep", "marketing", "contrary", "polish", "biology", "prompt", "zephyr", "expression", "linseed", "bagpipe", "center", "patience", "attenuation", "acrylic", "chapel", "extreme", "migrant", "teaching", "guilty", "final", "trapezoid", "avenue", "armor", "sandals", "stinger", "customer", "boss", "cutlet", "postbox", "press", "basket", "herb", "traffic", "while", "samurai", "hobby", "emergent", "crop", "guest", "women", "carriage", "decade", "building", "dust storm", "laparoscope", "practice", "mukluk", "discovery", "airport", "leaf", "mule", "publicity", "speed", "spur", "tempo", "gore-tex", "oasis", "councilor", "neurobiologist", "petal", "quantity", "torso", "perp", "bar", "corruption", "acknowledgment", "armoire", "monotheism", "pear", "liquid", "race", "listen", "bicycle", "use", "hovel", "tinderbox", "homonym", "parsnip", "argument", "grit", "perspective", "recorder", "landscape", "eyelids", "boundary", "suffocation", "mycoplasma", "mailbox", "brooch", "blackboard", "espadrille", "plunger", "bat", "success", "buyer", "independence", "washcloth", "church", "newsprint", "enemy", "dictionary", "peer-to-peer", "glasses", "pole", "campanile", "coat", "tablecloth", "inventor", "dill", "jump", "mime", "soldier", "off-ramp", "adult", "bondsman", "pest", "wash", "reference", "codon", "regular", "pelican", "plastic", "power", "vulture", "anybody", "algebra", "cyclamen", "exile", "name", "plowman", "curler", "transition", "worthy", "liner", "eyelash", "condition", "reason", "champion", "review", "plover", "aluminum", "fiddle", "racist", "buddy", "forest", "oatmeal", "sheet", "culvert", "chapter", "otter", "gherkin", "monger", "pump", "aftermath", "boar", "laughter", "quadrant", "rabbit", "trapezium", "unblinking", "smell", "bolt", "format", "pimp", "calm", "region", "census", "white", "reparation", "juice", "ratio", "manager", "hacienda", "pendulum", "step-uncle", "portfolio", "helen", "hurdler", "kielbasa", "ice-cream", "vengeance", "heyday", "footrest", "lycra", "hut", "waterspout", "parking", "south korea", "snail", "glockenspiel", "peak", "pinworm", "toad", "deodorant", "carry", "puffin", "strip", "unibody", "class", "paper", "good", "cable", "botany", "positive", "tube", "stadium", "castanets", "extension", "pace", "calcification", "cravat", "canvas", "hospice", "decimal", "economy", "washtub", "lesson", "donkey", "quail", "steeple", "prelude", "hospital", "curve", "wholesaler", "signature", "backpack", "shoe-horn", "whiskey", "let", "sampan", "bank", "conga", "music-box", "pith", "anesthesiology", "native", "treatment", "situation", "toenail", "waistband", "water", "instrument", "opossum", "bower", "semicircle", "cacao", "sousaphone", "park", "material", "stuff", "dictaphone", "hope", "carrot", "duffel", "beneficiary", "methodology", "gateway", "ripple", "go-kart", "cushion", "hook", "fall", "manufacturer", "working", "cabinet", "invention", "yarn", "devil", "blocker", "energy", "flame", "farm", "remove", "shoemaker", "wind-chime", "wedge", "pard", "latte", "togs", "intestines", "amusement", "conference", "kettledrum", "omega", "windscreen", "polenta", "body", "undershirt", "eye", "highlight", "midnight", "fortress", "raiment", "pickle", "angle", "stepson", "zither", "secretariat", "hardcover", "instruction", "close", "spirit", "trove", "raft", "clarinet", "interpreter", "evening-wear", "hay", "structure", "payee", "banquette", "denim", "kilt", "shop", "grip", "village", "size", "teen", "boots", "lyocell", "hotel", "hovercraft", "goldfish", "bugle", "tattler", "chivalry", "nonconformist", "department", "outhouse", "maniac", "thorn", "secure", "hedgehog", "vase", "mustache", "nightingale", "canal", "gallon", "elm", "skate", "pattern", "operation", "cancel", "silly", "typewriter", "wheel", "roll", "appendix", "gliding", "go", "thong", "crazy", "waist", "soccer", "temple", "injury", "dress", "tell", "tour", "environment", "eight", "bifocals", "galoshes", "subway", "retouch", "billboard", "beginning", "eyestrain", "kilogram", "drive", "criteria", "dinosaur", "misplacement", "pea", "nature", "pumpkin", "duck", "check", "flute", "garb", "enthusiasm", "visitor", "eyeliner", "grill", "stacking", "dolman", "piety", "internet", "broker", "style", "kale", "competition", "deviance", "thunder", "topsail", "collision", "disembodiment", "bathrobe", "yam", "mosquito", "analogy", "candidate", "fratricide", "mercury", "sneakers", "table", "fireman", "limit", "mutt", "negligee", "negative", "herring", "empowerment", "junior", "culture", "designer", "premeditation", "nonsense", "loaf", "breeze", "gender", "member", "expansion", "theme", "whirlpool", "ravioli", "speech", "howitzer", "section", "proposal", "telephone", "pinkie", "efficiency", "frazzle", "guy", "cynic", "blinker", "scale", "unit", "thomas", "shaker", "strait", "ukulele", "pannier", "few", "evaluator", "corn", "student", "cloud", "wheat", "media", "moccasins", "stress", "stole", "coach", "necessary", "altitude", "stylus", "set", "icicle", "beggar", "loan", "delete", "methane", "general", "slash", "urn", "aggression", "mint", "ott", "restaurant", "shark", "notoriety", "hang", "yoga", "male", "carpenter", "eagle", "shirt", "dry", "lipstick", "hobbies", "loincloth", "stay", "psychology", "mezzanine", "prizefight", "incident", "deployment", "access", "second", "wingtip", "clipper", "impulse", "forecast", "patricia", "tankful", "psychologist", "pew", "color", "barn", "depression", "metal", "quotation", "graphic", "deadline", "replace", "populist", "setting", "tank-top", "step-brother", "saving", "pedal", "snow", "grenade", "vineyard", "epee", "bootie", "rivulet", "mist", "stonework", "character", "sweatshop", "blazer", "holiday", "irony", "soot", "speedboat", "plywood", "emergency", "thing", "sandbar", "locomotive", "coffee", "wisteria", "jeans", "forgery", "titanium", "mosque", "colonisation", "earthquake", "step-mother", "bomber", "leg", "bosom", "ese", "lilac", "swimsuit", "pajamas", "machine", "porthole", "parchment", "dogwood", "driver", "rawhide", "giant", "trigonometry", "lyric", "booster", "pick", "beanstalk", "exhaust", "spectacle", "castanet", "camp", "importance", "reach", "initiative", "cancer", "fax", "ladybug", "volcano", "gem", "recruit", "baseball", "departure", "newsstand", "receipt", "enjoyment", "applause", "tyvek", "stocking", "session", "mission", "pause", "screenwriting", "sofa", "orchard", "dock", "midwife", "professional", "fox", "maestro", "circulation", "sprinter", "suspenders", "western", "sweets", "sound", "derby", "barstool", "lava", "suck", "permission", "uniform", "welcome", "beret", "complex", "manor", "preference", "sleet", "luttuce", "witch", "jewelry", "icon", "woodwind", "almanac", "breakpoint", "node", "lawyer", "particle", "beetle", "bookcase", "floor", "growth", "hell", "revenue", "film", "router", "talk", "win", "lisa", "air", "thistle", "location", "other", "vast", "marshland", "daughter", "runaway", "storyboard", "david", "rhythm", "fragrance", "monster", "oar", "birthday", "peacock", "monocle", "parentheses", "sample", "rhinoceros", "rainbow", "rider", "thermals", "law", "personal", "jam", "detail", "day", "beat", "grease", "spade", "robe", "chord", "due", "stool", "cobweb", "pride", "sleuth", "swedish", "granny", "tatami", "celery", "tabernacle", "beast", "notebook", "steel", "tom-tom", "high", "doll", "yellow", "bill", "seaside", "project", "lady", "lapdog", "saxophone", "challenge", "crotch", "ethernet", "oeuvre", "lemon", "significance", "gap", "ballpark", "forestry", "pancreas", "minimum", "certification", "difference", "result", "buckle", "iridescence", "jaguar", "bed", "weekender", "contact", "downforce", "keystone", "fairy", "foam", "money", "cascade", "meal", "seat", "authorisation", "south america", "briefs", "basketball", "year", "external", "share", "birdhouse", "bengal", "soybean", "slider", "coffin", "tutu", "timer", "celebration", "aglet", "pianist", "bowl", "exposition", "clip", "servant", "hubcap", "evocation", "cupola", "development", "bootee", "coinsurance", "collar", "carrier", "command", "e-reader", "ambition", "freight", "schnitzel", "unemployment", "view", "airforce", "memory", "niece", "wiseguy", "bloodflow", "fen", "lounge", "pack", "velodrome", "rutabaga", "local", "swordfish", "elbow", "fact", "attempt", "jumper", "lier", "dune buggy", "ranch", "usher", "regret", "hypothermia", "overclocking", "flesh", "task", "nothing", "cricketer", "hamaki", "hard-hat", "key", "attack", "mankind", "brass", "pinafore", "toque", "chalice", "larder", "gamebird", "sauce", "ejector", "assignment", "panpipe", "psychiatrist", "indication", "encyclopedia", "hemp", "archeology", "buffer", "agent", "fishnet", "stage", "requirement", "detention", "participant", "balaclava", "offence", "ridge", "delay", "hot-dog", "laptop", "actor", "routine", "citizenship", "sector", "blizzard", "establishment", "heavy", "mix", "moon", "chauffeur", "technologist", "turret", "possession", "substance", "tent", "station-wagon", "scarecrow", "stock-in-trade", "efficacy", "cell", "slime", "sun", "retailer", "swan", "occupation", "eyelid", "choice", "belligerency", "usual", "playground", "gown", "socks", "vellum", "zampone", "neologism", "candy", "brush", "influence", "authority", "weapon", "wonder", "chit-chat", "lace", "cymbal", "fly", "abroad", "knitting", "chair", "photo", "main", "booty", "fulfillment", "garter", "audience", "funny", "great", "lot", "others", "team", "sill", "test", "hosiery", "numismatist", "airfare", "hypochondria", "lap", "neck", "mattock", "smock", "relative", "colt", "schizophrenic", "ceiling", "fill", "security", "sweats", "news", "dump truck", "potty", "eyebrow", "leisure", "profit", "seed", "dragonfly", "osprey", "arm", "terrapin", "tailor", "commerce", "beer", "lathe", "clogs", "cricket", "major-league", "craw", "ocelot", "pha", "status", "toothpaste", "zoology", "bricklaying", "mice", "incandescence", "sibling", "epoch", "processing", "warmth", "content", "blade", "radiosonde", "stop", "yew", "vault", "click", "rest", "mine", "frost", "counter-force", "reveal", "feast", "destiny", "spleen", "nasty", "downgrade", "silo", "jot", "whale", "button", "fawn", "bucket", "penalty", "stair", "half-sister", "hyacinth", "sled", "inevitable", "gauge", "chalk", "disco", "creek", "pocket", "okra", "dilapidation", "junk", "signup", "texture", "senator", "bonus", "route", "grouper", "cleavage", "commission", "art", "choker", "bug", "dot", "councilperson", "play", "charm", "guide", "copywriter", "millisecond", "bongo", "spear", "bayou", "flag", "underwear", "bore", "bridge", "model", "club", "lecture", "outback", "wasp", "dirndl", "rheumatism", "note", "experience", "linguistics", "gong", "koala", "release", "glider", "hold", "outfit", "fish", "alligator", "text", "turnover", "sparrow", "birdcage", "deer", "ton", "database", "fire", "wall", "heartwood", "method", "bulldozer", "thaw", "shrine", "bad", "pig", "duckling", "tram", "circumference", "ecclesia", "chop", "relief", "oboe", "suit", "calculator", "friction", "tv", "baggage", "consulate", "knight", "odometer", "bet", "skullcap", "validity", "reject", "dentist", "sea", "need", "term", "ground", "cleat", "contagion", "riverbed", "pancake", "girdle", "bonnet", "repeat", "couple", "snob", "understanding", "panda", "saddle", "credenza", "mat", "cattle", "neuropathologist", "spiral", "cactus", "dressing", "staff", "roast", "bandana", "soft", "cardboard", "strategy", "consent", "refuse", "vitality", "young", "personality", "change", "wire", "bowler", "earplug", "igloo", "approval", "island", "pavement", "show", "harp", "transport", "anguish", "divider", "trousers", "truck", "fob", "oak", "vane", "chronograph", "clef", "gum", "analogue", "jumpsuit", "laryngitis", "leather", "thanks", "chicory", "trust", "hub", "creme brulee", "figure", "valance", "pool", "bull", "piss", "duster", "blood", "duplexer", "emergence", "chocolate", "knickers", "heaven", "month", "sunlamp", "singer", "procedure", "elongation", "doorknob", "shoe", "bra", "norse", "tangerine", "gallery", "hive", "chastity", "welfare", "hip", "lizard", "microwave", "spume", "in-laws", "person", "trainer", "request", "black", "patrimony", "quilt", "fluke", "flow", "stiletto", "tornado", "whistle", "cliff", "trellis", "weasel", "try", "presentation", "chemical", "pollution", "boogeyman", "maelstrom", "cargo", "yogurt", "medicine", "monitor", "classic", "governance", "batter", "plan", "ox", "former", "tosser", "effacement", "crocodile", "pamphlet", "rambler", "playroom", "claim", "aunt", "cleric", "settler", "automaton", "organ", "cent", "farmer", "fanlight", "hyena", "monsoon", "acoustic", "cytoplasm", "hire", "onion", "rubric", "shoulder", "aid", "arch-rival", "bellows", "dynamo", "manner", "eavesdropper", "precedent", "attic", "plant", "bin", "pyjama", "dealer", "regulation", "underpass", "thirst", "station", "conifer", "opera", "crackers", "spray", "dog", "asterisk", "line", "cross-contamination", "teletype", "fender", "hostel", "inflammation", "join", "rifle", "beech", "willow", "manx", "leave", "video", "diploma", "panic", "beanie", "type", "marksman", "credit", "crate", "pinto", "satisfaction", "trumpet", "gaiters", "army", "bracelet", "snowboarding", "octave", "fibre", "deck", "drop", "humour", "enquiry", "stock", "spaghetti", "nerve", "actress", "silver", "kidney", "bean", "bakeware", "diarist", "eyeball", "brome", "mid-course", "lettuce", "unity", "blind", "great-grandmother", "instrumentation", "alpenhorn", "canoe", "legume", "outcome", "selection", "wax", "obesity", "fat", "gymnast", "fur", "display", "spoon", "surprise", "habit", "cub", "hassock", "concrete", "creditor", "gander", "blue", "answer", "brand", "peanut", "pond", "root", "tote", "gift", "toy", "recliner", "bush", "gigantism", "grouse", "sunshine", "act", "conflict", "story-telling", "abolishment", "bloomers", "mechanic", "loafer", "maintenance", "sycamore", "trunk", "gyro", "candelabra", "angora", "bijou", "revenge", "misogyny", "snowman", "sectional", "average", "delight", "chemistry", "edward", "frown", "seaplane", "glove", "suspect", "condominium", "codpiece", "complement", "pseudoscience", "keyboard", "basement", "dimension", "scenery", "miscommunication", "studio", "chive", "evolution", "glen", "simple", "civilisation", "modem", "court", "president", "budget", "part", "refund", "public", "recommendation", "amount", "vessel", "defense", "apron", "icebreaker", "platform", "university", "cash", "ballet", "dessert", "broiler", "wolf", "mood", "artificer", "orator", "possibility", "tradition", "nexus", "owner", "addition", "bunghole", "country", "trouble", "search", "luggage", "effort", "peacoat", "spotlight", "slip", "wife", "trade", "examiner", "life", "address", "airship", "inquiry", "resolve", "top-hat", "wood", "creator", "delivery", "ruckus", "cradle", "cabin", "diner", "leverage", "microlending", "toothbrush", "nobody", "disk", "concern", "grammar", "error", "desire", "crush", "honeybee", "boy", "dogsled", "gobbler", "parade", "menorah", "zoologist", "neuropsychiatry", "inn", "swivel", "cupboard", "description", "bath", "climb", "cutting", "fleck", "kindness", "nose", "she", "atmosphere", "dwelling", "demur", "coil", "astrakhan", "children", "bead", "abacus", "electricity", "sugar", "downtown", "hail", "bakery", "debate", "laborer", "protocol", "sell", "stand", "recipe", "grass", "riser", "trapdoor", "vibration", "beauty", "parable", "filth", "submarine", "naturalisation", "house", "accordion", "eddy", "training", "mortise", "shawl", "cloudy", "caddy", "association", "step-father", "chug", "rack", "preparation", "seagull", "patrol", "caterpillar", "goodie", "philosophy", "awareness", "plantation", "closet", "relation", "cloakroom", "mixer", "coke", "vision", "wedding", "fir", "population", "hellcat", "poverty", "netball", "dig", "mammoth", "yard", "houseboat", "popsicle", "hockey", "mayonnaise", "you", "butane", "till", "wrist", "alcove", "hybridisation", "reflection", "grassland", "chaise", "harbour", "piano", "wafer", "movie", "inspection", "pepper", "space", "foot-rest", "panty", "comportment", "artichoke", "job", "health", "sushi", "belief", "washer", "custard", "accommodation", "director", "pompom", "spine", "print", "caboose", "barber", "tramp", "workbench", "stud", "kneejerk", "topic", "saviour", "hurricane", "crawdad", "broad", "maiden", "study", "filly", "scent", "creature", "rubber", "canteen", "height", "pie", "big", "felony", "replication", "turtle", "mall", "child", "armadillo", "underwire", "spring", "soup", "bangle", "euphonium", "net", "redesign", "teller", "assistant", "blanket", "cement", "asparagus", "good-bye", "jackal", "timbale", "triangle", "sweat", "cream", "diction", "comradeship", "ice", "fusarium", "harm", "stone", "tambourine", "notice", "television", "temptress", "variety", "gene", "temperature", "vegetarianism", "championship", "sign", "glue", "meat", "fiction", "employer", "basis", "harpooner", "reindeer", "sunbonnet", "aspect", "index", "goggles", "speaker", "ecliptic", "twine", "show-stopper", "haunt", "headrest", "car", "evidence", "imprisonment", "journey", "cowbell", "platypus", "rhyme", "scheme", "stallion", "volleyball", "night", "computer", "grape", "dory", "tadpole", "series", "flax", "magazine", "painting", "drummer", "license", "potential", "find", "mouse", "baby", "player", "step-sister", "slide", "strike", "earth", "pulley", "vanity", "brassiere", "purpose", "continent", "passenger", "crime", "goat", "mail", "alder", "cook", "toreador", "cowboy", "barracks", "income", "bird", "helmet", "ounce", "midi", "airbus", "emery", "helium", "karen", "pharmacopoeia", "cribbage", "publisher", "entrance", "tomography", "beaver", "electrocardiogram", "hearthside", "sentence", "spinach", "twist", "haversack", "helo", "measure", "fortnight", "touch", "limo", "caftan", "control", "airmail", "pizza", "snowplow", "inglenook", "spare", "racism", "pagoda", "ashtray", "death", "caution", "jealousy", "right", "thermometer", "half", "sock", "mascara", "complaint", "gain", "dud", "screen", "ketchup", "tepee", "octavo", "sweatshirt", "nightlight", "animal", "overnighter", "cloister", "composer", "patient", "relationship", "shoelace", "cap", "surgery", "direction", "bloom", "bass", "beginner", "constant", "summer", "cherry", "nondisclosure", "consideration", "promise", "geography", "mirror", "retina", "sausage", "cup", "balance", "brown", "niche", "employ", "boxer", "mousse", "shelter", "amendment", "family", "ecumenist", "father", "tonight", "tunic", "sloth", "llama", "streetcar", "piece", "plain", "eclipse", "commercial", "mode", "homework", "jeep", "transportation", "colony", "shine", "signet", "goal", "zinc", "load", "camel", "songbird", "bladder", "chairlift", "flock", "lie", "nylon", "cloth", "siding", "liquor", "brave", "slice", "mess", "bell", "lout", "clavicle", "blackfish", "achiever", "macaroni", "buzzard", "brushfire", "hacksaw", "blowhole", "bathtub", "novel", "society", "thrill", "question", "tribe", "reminder", "watch", "percentage", "server", "dugout", "rise", "gamma-ray", "puddle", "version", "galn", "tortellini", "corner", "spite", "vise", "example", "technology", "poison", "racer", "reliability", "sailor", "conductor", "hawk", "hate", "essay", "churn", "daffodil", "daniel", "step-daughter", "scow", "street", "carp", "measurement", "degree", "grey", "flugelhorn", "fleece", "astrolabe", "beef", "handlebar", "joint", "rethinking", "toothpick", "traditionalism", "chaos", "charlatan", "hammock", "railway", "stomach", "spend", "litter", "trolley", "pillow", "trim", "squirrel", "baobab", "cartilage", "dame", "polyester", "rotate", "brace", "freon", "punch", "anklet", "skywalk", "elk", "ringworm", "south", "planet", "swing", "wrench", "barbiturate", "stupidity", "gear", "service", "estimate", "silica", "ziggurat", "walrus", "criterion", "temporary", "jogging", "communication", "menu", "lymphocyte", "shore", "carnation", "espalier", "frigate", "lantern", "bunkhouse", "wealth", "effective", "gopher", "profile", "shanty", "grab-bag", "satire", "trial", "gloves", "hammer", "chauvinist", "drama", "competitor", "pronunciation", "detective", "risk", "beach", "prose", "improvement", "shoestring", "turnstile", "wrap", "phrase", "tortoise", "minister", "state", "accident", "brick", "gold", "cousin", "jasmine", "fail", "move", "peony", "trip", "xylophone", "balalaika", "chance", "fisting", "sidecar", "bone", "mastoid", "cyst", "bait", "future", "permafrost", "prow", "vaulting", "inside", "flat", "prosecution", "adulthood", "logic", "acid", "attorney", "sand", "switch", "analog", "steam", "brochure", "normal", "advertisement", "spider", "fertilizer", "geranium", "burn", "septicaemia", "cake", "county", "advantage", "legal", "mom", "canopy", "ship", "epoxy", "veldt", "pants", "wrong", "stupid", "leadership", "surname", "obligation", "leaver", "kitty", "alternative", "dashboard", "barbeque", "fishery", "warden", "vagrant", "disposer", "spell", "ascot", "stamp", "story", "signal", "wharf", "dredger", "career", "fraudster", "wisdom", "shadow", "bud", "magic", "differential", "gaffer", "standoff", "snakebite", "standard", "clutch", "image", "senior", "alibi", "parrot", "backdrop", "meet", "fanny-pack", "interloper", "petticoat", "saloon", "following", "screw", "suitcase", "winter", "property", "ad", "corsage", "eurocentrism", "couch", "grandmother", "trash", "lute", "pleated", "puma", "beard", "compost", "porcupine", "measles", "gale", "orangutan", "whorl", "rectangle", "casement", "elephant", "comfort", "bagel", "award", "sunglasses", "east", "europe", "shape", "meteor", "moment", "gorilla", "porter", "croissant", "highway", "put", "draft", "failure", "gastropod", "paint", "still", "cane", "ramie", "nougat", "waitress", "turkish", "cheque", "week", "pounding", "radar", "road", "dipstick", "tendency", "kamikaze", "shampoo", "well", "craftsman", "stag", "hygienic", "transmission", "townhouse", "wildlife", "feed", "number", "violin", "associate", "rank", "charge", "furniture", "issue", "crude", "guard", "schedule", "radiator", "reserve", "tune", "liver", "deputy", "pouch", "tire", "revolve", "pension", "spectrograph", "support", "thunderbolt", "analyst", "clove", "thinking", "trout", "faucet", "assist", "committee", "pyramid", "valley", "throat", "vegetable", "raspberry", "cooking", "exam", "hunt", "cabbage", "knife", "honesty", "slope", "casserole", "fairies", "opening", "silk", "sleep", "editor", "tambour", "mixture", "oldie", "trailer", "ophthalmologist", "rat", "rocker", "rub", "hydraulics", "anthony", "tow-truck", "smile", "ape", "tard", "ephemeris", "pacemaker", "tsunami", "birth", "sociology", "mud", "hand-holding", "planter", "primary", "tachometer", "private", "sharon", "fortune", "cheek", "pasta", "tractor", "natural", "needle", "starter", "fold", "individual", "tower", "chick", "crew", "depth", "grandmom", "laundry", "milk", "calf", "analgesia", "aftershock", "robin", "save", "blouse", "dedication", "back", "original", "research", "loyalty", "fingernail", "boatload", "woodland", "cardigan", "exercise", "mallet", "iris", "chalet", "category", "extent", "refrigerator", "bestseller", "manservant", "thread", "confidence", "confusion", "snuggle", "eat", "maraca", "asphalt", "numeracy", "transaction", "sink", "governor", "steak", "volume", "implement", "panties", "cot", "quit", "fatigues", "torchiere", "cornerstone", "interview", "inch", "cork", "metronome", "propane", "capon", "celsius", "greek", "internal", "mobile", "bathroom", "parallelogram", "enigma", "orchestra", "fountain", "bungalow", "popcorn", "alpha", "common", "brow", "forehead", "look", "convertible", "mound", "bibliography", "thunderhead", "arithmetic", "textbook", "overcharge", "people", "flower", "block", "latex", "replacement", "cut", "rabbi", "underneath", "orange", "place", "shock", "somewhere", "umbrella", "decrease", "telescreen", "exchange", "weight", "corduroy", "aftershave", "bedroom", "sculpture", "sweatsuit", "step-aunt", "explanation", "pop", "solitaire", "return", "introduction", "snowmobiling", "specific", "innocent", "sorbet", "stem", "outlay", "star", "puppy", "season", "machinery", "area", "drake", "buy", "role", "college", "communicant", "boot", "cougar", "soprano", "step-son", "miss", "somersault", "waffle", "mouton", "guess", "litigation", "headline", "consonant", "corral", "living", "mangrove", "miter", "honoree", "course", "expansionism", "criticism", "hoe", "account", "fanny", "beautiful", "benefit", "furnace", "precipitation", "sturgeon", "hydrant", "dragster", "alarm", "broccoli", "trowel", "colon", "mountain", "facilities", "photographer", "principal", "guitarist", "board", "encirclement", "mistake", "smoke", "trench", "wait", "walk", "jet", "past", "guarantee", "sir", "patio", "box", "design", "bustle", "hops", "shirtdress", "ellipse", "production", "shakedown", "whirlwind", "freezer", "cost", "anthropology", "numeric", "surface", "crinoline", "brandy", "fence", "almond", "pile", "spike", "walkway", "goodbye", "object", "monastery", "quote", "polo", "eggplant", "moonscape", "decryption", "prior", "diamond", "bite", "spasm", "feeling", "tough", "wet-bar", "attraction", "colloquia", "statement", "breadcrumb", "flu", "maybe", "post", "network", "spot", "dinner", "auditorium", "jelly", "diver", "virtue", "apparel", "order", "struggle", "supply", "hose", "bear", "ray", "timeline", "tin", "athlete", "warlock", "maximum", "chicken", "total", "fencing", "cigarette", "fondue", "smelting", "horse", "fan", "field", "jar", "snowsuit", "girlfriend", "brief", "ingrate", "rediscovery", "trachoma", "religion", "ambassador", "heart", "wing", "punctuation", "granddaughter", "appointment", "chard", "dance", "leading", "marsh", "straw", "waterbed", "fog", "gelding", "stitch", "band", "bottling", "quart", "tea", "wave", "storage", "bookend", "walker", "bird-watcher", "jeff", "paddle", "uncle", "roundabout", "guidance", "cormorant", "penicillin", "digger", "ghost", "spiritual", "helicopter", "palm", "tool", "vertigo", "wampum", "workhorse", "yurt", "debtor", "hedge", "poppy", "recognition", "link", "serve", "burglar", "pressroom", "porch", "behavior", "north", "reprocessing", "sort", "grain", "mantel", "anywhere", "loss", "rose", "comfortable", "quiver", "advance", "snowflake", "jiffy", "seeder", "alto", "background", "acupuncture", "jute", "stance", "bratwurst", "pocketbook", "doubter", "great-grandfather", "cathedral", "semicolon", "cape", "suggestion", "mark", "driving", "facet", "halibut", "burlesque", "noise", "square", "endothelium", "hobbit", "cellar", "pigeon", "seashore", "rayon", "pioneer", "plane", "vacuum", "battleship", "hatred", "word", "football", "bother", "theory", "innocence", "cannon", "plaster", "give", "skin", "valuable", "dromedary", "motel", "tax", "bolero", "organization", "cartoon", "husband", "poof", "hackwork", "protest", "contribution", "motorcycle", "wingman", "apple", "cartridge", "passage", "heirloom", "dime", "plasterboard", "war", "consequence", "weeder", "yesterday", "comic", "lightning", "kitchen", "earthworm", "flavor", "danger", "butcher", "blister", "land", "gasoline", "executor", "theism", "industry", "skirt", "panther", "tattoo", "worklife", "pawnshop", "bust", "karate", "deathwatch", "office", "squatter", "celeriac", "raccoon", "cord", "monasticism", "reputation", "nest", "administration", "calendar", "screamer", "den", "fear", "copy", "reactant", "record", "anatomy", "cuticle", "dream", "phase", "veal", "skylight", "forearm", "handle", "medium", "might", "morning", "rim", "turnip", "roof", "tassel", "vibe", "queen", "octagon", "official", "lynx", "paramedic", "trail", "woolen", "shoat", "syndicate", "genetics", "window", "circle", "software", "nitrogen", "today", "illegal", "outrigger", "nurse", "party", "alley", "bench", "blackberry", "engineer", "catacomb", "egghead", "gosling", "king", "help", "vest", "hog", "nation", "pine", "pony", "arm-rest", "landform", "flanker", "monkey", "stencil", "plier", "sunday", "kingfish", "lake", "poster", "swiss", "fiberglass", "dimple", "divide", "safe", "oven", "shears", "strawberry", "drum", "woodshed", "perception", "armament", "instance", "snowstorm", "aperitif", "mattress", "prince", "contrail", "tension", "call", "stain", "blowgun", "co-producer", "shopper", "handicap", "cicada", "pay", "quarter", "hydrogen", "reception", "hair", "wallaby", "writer", "anime", "clockwork", "centimeter", "belfry", "bee", "oxen", "hardboard", "big-rig", "lawsuit", "dad", "invoice", "drunk", "hostess", "knuckle", "shield", "hatchet", "intention", "kind", "chiffonier", "greenhouse", "pelt", "pint", "pumpkinseed", "rail", "printer", "compulsion", "flood", "politics", "tree", "digestion", "coevolution", "existence", "milkshake", "chateau", "adrenalin", "blossom", "costume", "deposit", "row", "sport", "suburb", "desert", "pen", "appearance", "judo", "athletics", "respite", "drawbridge", "crook", "motorboat", "leaker", "sheep", "worth", "plate", "chipmunk", "taxicab", "blight", "jaw", "junker", "impudence", "hello", "hutch", "presence", "rush", "airplane", "group", "school", "mother", "client", "truckit", "gossip", "watchmaker", "employment", "confectionery", "divan", "fishing", "sidewalk", "shrimp", "breakfast", "hardening", "console", "dart", "yacht", "escape", "lay", "crowd", "difficulty", "pvc", "math", "food", "clothing", "poisoning", "crown", "slipper", "tandem", "casino", "clock", "bow", "grand", "subsidence", "fang", "pleasure", "ease", "draw", "arrow", "dresser", "rag", "agency", "repair", "cesspool", "glad", "reduction", "aside", "factory", "self", "tunnel", "godmother", "buffet", "airbag", "focus", "linen", "netbook", "opposite", "cuckoo", "dulcimer", "hour", "pheasant", "entry", "motion", "finish", "exclamation", "bowtie", "easel", "end", "gall-bladder", "lei", "list", "rake", "skunk", "tongue", "fishbone", "underground", "input", "british", "macadamia", "sensitive", "hornet", "embossing", "t-shirt", "tussle", "breath", "detainment", "double", "fine", "mouser", "cloak", "toe", "it", "quicksand", "landmine", "latency", "passbook", "camera", "octopus", "facelift", "green", "hat", "crib", "lobster", "drawing", "stockings", "tam", "flytrap", "mayor", "stopwatch", "theater", "clapboard", "thumb", "fahrenheit", "towel", "freeplay", "ashram", "basin", "e-book", "company", "conclusion", "gas", "hill", "parachute", "pharmacist", "price", "carol", "shortwave", "major", "revolution", "lighting", "antelope", "skull", "ruffle", "foray", "swimming", "hall", "harmony", "harpsichord", "backbone", "reward", "consul", "banjo", "hand", "solution", "clank", "doctor", "bassoon", "oxygen", "beheading", "cottage", "gram", "bathhouse", "firewall", "joke", "james", "styling", "bread", "trick", "creative", "dust", "meteorology", "ex-husband", "bandanna", "candle", "disease", "bend", "chain", "trinket", "stack", "cyclone", "tomorrow", "dignity", "minor-league", "salon", "celeste", "break", "mind", "stepmother", "width", "architecture", "hen", "wind", "sundial", "rocket-ship", "spectacles", "recreation", "bull-fighter", "slave", "waste", "wine", "observatory", "peace", "missile", "dagger", "quince", "employee", "mile", "abdomen", "blank", "cemetery", "dramaturge", "maple", "specialist", "ball", "jellyfish", "butter", "occasion", "equal", "synod", "dish", "battery", "female", "run", "blame", "eyebrows", "nightclub", "sardine", "shoehorn", "vixen", "git", "oncology", "priority", "declination", "cabana", "letter", "meaning", "salt", "consist", "nut", "familiar", "mop", "examination", "voice", "match", "gladiolus", "fringe", "weed", "grade", "believe", "damage", "mailman", "master", "remote", "preoccupation", "duty", "tail", "gland", "shelf", "tanker", "tenor", "ferryboat", "dishwasher", "gauntlet", "belt", "wish", "atom", "rod", "resist", "tabby", "bronze", "item", "font", "bubble", "composition", "garment", "district", "lanai", "push", "doubt", "plot", "shame", "shingle", "syrup", "criminal", "roller", "decongestant", "affair", "refectory", "necklace", "channel", "context", "engine", "forever", "bitter", "omelet", "scrip", "anteater", "cart", "chime", "finding", "tough-guy", "cummerbund", "feather", "bobcat", "dumbwaiter", "single", "viscose", "clover", "lark", "trooper", "sombrero", "bankbook", "rich", "contact lens", "taxi", "jail", "room", "disconnection", "being", "marxism", "quartz", "venom", "bronco", "sing", "fault", "professor", "mole", "leader", "equinox", "racing", "noodle", "best-seller", "heartache", "moonshine", "rain", "correspondent", "avalanche", "covariate", "level", "resident", "sourwood", "accountant", "component", "swell", "idea", "sphynx", "international", "shadowbox", "shot", "destruction", "bamboo", "pudding", "cd", "rock", "chandelier", "community", "babe", "bribery", "elixir", "inspector", "jumbo", "payment", "metro", "mass", "soap", "gynaecology", "painter", "spacing", "special", "chairman", "stepping-stone", "stopsign", "armchair", "softball", "timeout", "dwarf", "editorial", "campaign", "infancy", "love", "schoolhouse", "millennium", "disguise", "frock", "soulmate", "sash", "tomato", "lyre", "geyser", "eviction", "paddock", "grapefruit", "period", "string", "vermicelli", "insulation", "ring", "galley", "zucchini", "eardrum", "olive", "visual", "cross-stitch", "dependent", "stumbling", "pull", "base", "croup", "foxglove", "jailhouse", "piracy", "decision", "cope", "resale", "swamp", "violet", "ordination", "accompanist", "coin", "sneeze", "alb", "cone", "chimpanzee", "bough", "cappuccino", "cow", "garbage", "mention", "reading", "steps", "alphabet", "rostrum", "meeting", "shofar", "constellation", "length", "heron", "mitten", "finance", "toast", "cephalopod", "dishes", "drain", "organisation", "cause", "scarification", "comparison", "twig", "comma", "witness", "heat", "gym", "centurion", "bacon", "hourglass", "obedience", "yarmulke", "fridge", "nonbeliever", "usage", "ry", "ambulance", "dancing", "most", "macrofauna", "satin", "feature", "assumption", "blow", "long", "parcel", "dhow", "roadway", "figurine", "lye", "samovar", "shoot", "schooner", "grasshopper", "boudoir", "contract", "division", "n", "luncheonette", "childhood", "gratitude", "bullet", "carotene", "gymnastics", "music-making", "river", "tank", "zoot-suit", "flintlock", "value", "wholesale", "macrame", "wrecker", "top", "tabletop", "boyfriend", "device", "wren", "speakerphone", "fruit", "ant", "sister-in-law", "ticket", "sponge", "cob", "cameo", "hyphenation", "jewel", "lung", "script", "stamina", "tourist", "homogenate", "millimeter", "pitch", "problem", "softdrink", "analysis", "intelligence", "distance", "bikini", "preface", "form", "ephemera", "accelerant", "randomisation", "surround", "picket", "lion", "tile", "minion", "purse", "packet", "interest", "zipper", "hamburger", "c-clamp", "world", "physics", "lumber", "neon", "combat", "gemsbok", "conspirator", "capitulation", "ostrich", "promotion", "innervation", "activity", "babushka", "impress", "supermarket", "friendship", "information", "haircut", "government", "proof-reader", "bid", "balcony", "gazebo", "republic", "option", "girl", "grocery", "safety", "applewood", "cenotaph", "one", "site", "nutrition", "register", "trombone", "bog", "mambo", "yin", "sympathy", "minute", "lawn", "savior", "edge", "stepdaughter", "comment", "sitar", "calico", "cry", "ruin", "step-grandfather", "sex", "plenty", "weather", "branch", "seafood", "demand", "countess", "dickey", "lemonade", "contest", "soy", "lan", "pupil", "legging", "bus", "border", "clave", "sunflower", "flour", "cocktail", "raffle", "vacation", "compassion", "pad", "perch", "ping", "cloudburst", "policy", "tap", "whole", "instrumentalist", "lacquerware", "primate", "kayak", "rip", "start", "gazelle", "anethesiologist", "jury", "cafe", "aluminium", "intestine", "dragon", "paintwork", "shorts", "calculation", "fedora", "tavern", "freedom", "viola", "side", "chef", "geometry", "music", "philosopher", "impact", "satellite", "spank", "pier", "waiter", "recover", "purple", "agenda", "facsimile", "if", "cultivar", "secretary", "ornament", "statistic", "way", "distribution", "eponym", "mini-skirt", "rice", "kohlrabi", "mustard", "step", "appliance", "output", "puritan", "anything", "thought", "antechamber", "shootdown", "courage", "caravan", "envy", "juggernaut", "fireplace", "nail", "slapstick", "underclothes", "lentil", "target", "disengagement", "business", "disadvantage", "recess", "mask", "zoo", "washbasin", "brother-in-law", "pillbox", "coverall", "pansy", "kleenex", "quiet", "knife-edge", "carport", "sledge", "clause", "relaxation", "veil", "evening", "face", "veranda", "combination", "larch", "labour", "ability", "gather", "anger", "fee", "passive", "protection", "silence", "violence", "wrinkle", "bottom-line", "epauliere", "peer", "intervenor", "fedelini", "badge", "chafe", "performance", "sepal", "teacher", "warm-up", "fight", "flare", "funeral", "hoof", "pocket-watch", "product", "swath", "tights", "hospitality", "clue", "proof", "dryer", "travel", "snake", "brushing", "column", "shed", "scrim", "morsel", "folder", "hurry", "ptarmigan", "pressure", "dahlia", "heart-throb", "brain", "count", "squeegee", "drizzle", "hunger", "collection", "floozie", "daisy", "pineapple", "coonskin", "horn", "chess", "chowder", "coal", "boat", "iron", "pink", "shade", "system", "tuna", "upper", "dirt", "bag", "eave", "lead", "notify", "vegetation", "tiara", "copper", "flight", "pince-nez", "motorcar", "opium", "locust", "beak", "raise", "astrologer", "rent", "margin", "raven", "shower", "breastplate", "track", "tummy", "vinyl", "cassock", "era", "shred", "sword", "marimba", "kilometer", "hallway", "hood", "combine", "connection", "affect", "kid", "vibraphone", "ocean"], "adjectives": ["easter", "bingo", "clerk", "espionage", "horror", "coconut", "crocodile", "ticker", "fixing", "resurgence", "means", "metre", "catfish", "encampment", "likeness", "listener", "quorum", "disarmament", "google", "bicycle", "infiltration", "lordship", "inaccuracy", "clutches", "civility", "pundit", "attraction", "statement", "scenario", "stimulus", "spoiler", "intolerance", "stairway", "mentality", "cynicism", "foothold", "reformer", "contentment", "diver", "horseman", "arrears", "intruder", "matron", "potassium", "metaphysics", "redundancy", "seizure", "doorstep", "cabal", "outage", "earnestness", "formula", "tourney", "artisan", "digress", "humility", "blather", "advancement", "diploma", "announcement", "proceedings", "proximity", "girlfriend", "appeasement", "cheesecake", "repayment", "retention", "appointment", "reaction", "specimen", "denomination", "staircase", "whiteness", "adjustment", "frequency", "embroidery", "spaghetti", "martin", "actress", "quart", "developer", "heads", "liner", "folklore", "jenny", "rubbing", "countdown", "chemotherapy", "locality", "miner", "poker", "glitter", "firing", "bondage", "digger", "poultry", "villa", "snapshot", "outcome", "kangaroo", "progression", "auspices", "duchess", "recognition", "groundwork", "threshold", "vulnerability", "meantime", "artistry", "mayer", "networking", "reviewer", "gunman", "vindication", "longevity", "pendulum", "lineup", "scouring", "misery", "appraisal", "emancipation", "pointer", "simplicity", "enclosure", "avarice", "brewer", "seeder", "commander", "snail", "tracing", "conflict", "caught", "semicolon", "plaza", "youngster", "allotment", "airtime", "dealing", "posterity", "exaggeration", "shoplifting", "neighbour", "prorogation", "docking", "maintenance", "protein", "semiconductor", "playing", "workman", "barrister", "scolding", "deliverance", "apologise", "innocence", "illustration", "mobility", "receptor", "donkey", "narrator", "iniquity", "condominium", "juror", "matrix", "postponement", "ignition", "scenery", "providence", "plurality", "coyote", "ralph", "morale", "allegation", "cartridge", "civilisation", "flask", "murderer", "projection", "repentance", "subscription", "vicinity", "recourse", "sesame", "spectre", "hostility", "adage", "defection", "university", "clearance", "ballet", "invasion", "panther", "parsley", "lookout", "tablespoon", "bedtime", "inspiration", "intersection", "manufacturer", "nexus", "nuisance", "owner", "completeness", "opposition", "deficiency", "reputation", "mythology", "fetish", "anatomy", "accounting", "terrier", "estimation", "inaction", "creator", "baron", "barrier", "underdog", "hacker", "bureaucracy", "nobody", "wardrobe", "error", "consultancy", "lodging", "reinstatement", "conversation", "instruction", "rodeo", "rationality", "china", "dialect", "medics", "redemption", "coding", "influx", "drilling", "dwelling", "armour", "blackberry", "distributor", "electricity", "flora", "chivalry", "forefront", "windfall", "womanhood", "adultery", "shaving", "tights", "concur", "diversity", "laborer", "orientation", "privacy", "involvement", "sufferer", "absorption", "deduction", "curfew", "recipe", "skate", "hoarding", "ferocity", "magnificence", "intercession", "operation", "negligence", "reassurance", "exploitation", "appendix", "monarchy", "poster", "seduction", "criminality", "iceberg", "soccer", "accountability", "environment", "association", "prospectus", "woodward", "acquiescence", "allies", "posting", "roadblock", "foyer", "colors", "slugger", "cursor", "fertilization", "annoyance", "intermission", "nationality", "notification", "mirth", "fries", "mutation", "reins", "correlation", "line-up", "simulation", "hockey", "trauma", "extinction", "enthusiasm", "whereabouts", "apparatus", "helper", "browsing", "canonization", "despotism", "countryman", "fastball", "glamour", "outdoors", "movie", "theology", "waistcoat", "litre", "competition", "formality", "crossroads", "commissioner", "custard", "accommodation", "habitation", "bodyguard", "adherence", "blossom", "feedback", "provocation", "collision", "functionality", "suburb", "earnings", "intercourse", "lowry", "misunderstanding", "feces", "hurricane", "irrigation", "function", "glucose", "sweepstakes", "check-in", "hello", "by-election", "seriousness", "comedian", "height", "anxiety", "parliament", "employment", "normalcy", "redistribution", "riches", "effectiveness", "eyewitness", "thicket", "staging", "viewpoint", "allergy", "accomplice", "brunt", "homeland", "scissors", "contractor", "delicacy", "breadth", "suspension", "refinery", "adoption", "saturday", "calamity", "phosphorus", "clothing", "schoolboy", "stole", "cholera", "violation", "thoroughfare", "stylus", "burglary", "greens", "aggression", "persona", "arrow", "restaurant", "robber", "eloquence", "circus", "basis", "battling", "solitude", "computing", "comrade", "joseph", "grandeur", "follower", "imprisonment", "saucer", "anemia", "depression", "radiance", "exclamation", "grouping", "bounds", "ducking", "therapy", "constable", "carcass", "mathematician", "darkness", "storey", "bonding", "putting", "rector", "swimmer", "ankle", "dollar", "grocer", "aesthetics", "certainty", "thunderstorm", "anomaly", "cracker", "passenger", "treadmill", "dexterity", "priesthood", "mayor", "theater", "toxicity", "differentiation", "probation", "basin", "ounce", "encouragement", "transmission", "bomber", "contents", "footing", "lighting", "frenchman", "penguin", "publisher", "complexity", "recurrence", "shopping", "dossier", "driver", "cutter", "grappling", "residency", "consul", "madness", "banjo", "racism", "dismissal", "oxygen", "accessibility", "pairing", "spectacle", "souvenir", "plateau", "handling", "altercation", "resentment", "to-day", "appellation", "lifeline", "volcano", "departure", "applause", "beginner", "atheism", "deflation", "acceptance", "tycoon", "provider", "touchdown", "sophistication", "cyclone", "mowing", "lustre", "outfield", "standstill", "width", "happiness", "architecture", "demon", "bending", "adaptation", "recreation", "apostle", "equation", "insanity", "permission", "designation", "outset", "sloth", "commenter", "knocking", "quilting", "climber", "cemetery", "maple", "pottery", "regularity", "squad", "dispatcher", "unification", "helping", "thriller", "battery", "colleague", "nylon", "terror", "indicator", "victory", "siding", "abstinence", "tuning", "conflagration", "advice", "breaker", "consist", "nursery", "rapport", "advertising", "examination", "scrum", "weariness", "cassette", "balls", "chasm", "daddy", "confiscation", "preoccupation", "words", "scrimmage", "baker", "vogue", "unhappiness", "dugout", "hierarchy", "definition", "header", "flashing", "pragmatism", "insurer", "retirement", "technology", "precinct", "sharpness", "relativism", "innovation", "christianity", "loathing", "self-respect", "monument", "annuity", "ratification", "sperm", "standpoint", "agriculture", "nourishment", "tendon", "measurement", "organizer", "snead", "formation", "obscenity", "culprit", "crossover", "hammock", "self-control", "pneumonia", "nervousness", "damsel", "falls", "comer", "rancher", "observer", "mahogany", "bowling", "translation", "certification", "gridlock", "manifesto", "fraud", "affinity", "jogging", "noodle", "frigate", "vaccination", "mechanics", "wealth", "downside", "actuality", "freestyle", "cheerleader", "policeman", "outpost", "pretense", "subsidy", "uprising", "elements", "widget", "cylinder", "genitals", "absurdity", "solemnity", "perusal", "tossing", "disservice", "brotherhood", "syndrome", "carrier", "imperialism", "inevitability", "chili", "sister", "memory", "commemoration", "campaign", "dumps", "twenties", "vocalist", "brunch", "mover", "logic", "parson", "melodrama", "stoppage", "absence", "handshake", "traveler", "conspiracy", "verification", "mantra", "advertisement", "taker", "inactivity", "eagerness", "jurisprudence", "leadership", "nucleus", "hands", "originality", "attractiveness", "assignment", "bases", "layout", "apartheid", "sending", "template", "viability", "detention", "publicist", "covering", "leopard", "stocks", "birthplace", "witchcraft", "repository", "scholarship", "biography", "stillness", "polling", "mouthful", "organisation", "begun", "captaincy", "synopsis", "endangerment", "misconception", "drunkenness", "coaster", "hegemony", "semifinal", "saloon", "headset", "lifeblood", "subcommittee", "runoff", "squid", "heath", "ambulance", "retailer", "outing", "combustion", "phrasing", "ardor", "attacker", "watchdog", "commune", "schooner", "telephony", "buyout", "authority", "enlightenment", "prominence", "aversion", "demeanor", "fascism", "self-confidence", "booty", "fulfillment", "leasing", "prisoner", "waitress", "syrah", "daybreak", "indecency", "cropping", "aircraft", "configuration", "celebrity", "barrymore", "friendliness", "scooter", "coverage", "gallantry", "onslaught", "gusto", "chihuahua", "piles", "pounding", "puberty", "reader", "tendency", "rapidity", "juncture", "vomiting", "cilantro", "tiger", "dishonesty", "stamina", "obscurity", "tourist", "illustrator", "accuracy", "stanza", "demonstration", "molasses", "ranger", "liquidation", "diagnosis", "larceny", "physique", "mortality", "processing", "babbling", "genesis", "prototype", "voltage", "righteousness", "trout", "infamy", "warmth", "charade", "wiring", "collaborator", "futility", "dominion", "hamburger", "cabbage", "ammonia", "plethora", "proceeding", "interact", "pullman", "honesty", "dominance", "variation", "clearing", "mango", "speculation", "stagnation", "editor", "consolidation", "jones", "precedence", "neighborhood", "backlash", "forgiveness", "momentum", "abundance", "licence", "iteration", "epilepsy", "republic", "musician", "schism", "senator", "councilman", "cabot", "bonus", "embodiment", "mailing", "nutrition", "interpretation", "allegiance", "specification", "pasta", "headcount", "motto", "tractor", "cross-examination", "headquarters", "savior", "forefinger", "narration", "doorway", "processor", "reinforcement", "literature", "disobedience", "corpus", "interval", "dedication", "mediator", "boasting", "discord", "underwear", "novella", "sorcery", "inauguration", "peter", "dawning", "patchwork", "specs", "transmitter", "confidant", "refrigerator", "kingdom", "archipelago", "mayhem", "depletion", "eater", "martyrdom", "environs", "pessimism", "terry", "drafting", "opportunity", "cornerstone", "overseer", "pathos", "serenity", "alligator", "assembly", "framework", "devolution", "finale", "orchestra", "bones", "repertoire", "rebirth", "method", "tavern", "closeness", "advert", "oracle", "philosopher", "patriotism", "snack", "housing", "investment", "rocks", "laurels", "liberation", "curator", "domination", "distribution", "validity", "withholding", "mainframe", "sinking", "prophecy", "dentist", "propensity", "dioxide", "somewhere", "tyrant", "majority", "hardship", "bullion", "nobility", "scarcity", "vampire", "helplessness", "accreditation", "allegory", "juggernaut", "regulator", "servitude", "instructor", "sarcasm", "abbey", "boardroom", "trilogy", "broth", "lineage", "ma'am", "syntax", "dynamics", "asthma", "consistency", "machinery", "relaxation", "sewing", "mouthpiece", "billing", "pharaoh", "college", "nightmare", "sweater", "sediment", "immunization", "brainstorming", "disability", "hearth", "brightness", "orientalism", "aviation", "cumin", "success", "ultimatum", "delirium", "envoy", "fundraiser", "paradox", "boldness", "counselor", "allocation", "litigation", "equator", "salvation", "storyteller", "fragmentation", "manga", "ligament", "cyclist", "homer", "resignation", "evacuation", "pueblo", "biology", "acreage", "snark", "vanguard", "fusion", "broccoli", "legislation", "degeneration", "gallery", "supposition", "immunity", "catholicism", "offense", "hearts", "system", "rendition", "drank", "bookmark", "expediency", "vegetation", "illness", "delegation", "fluke", "drumming", "building", "conduit", "discovery", "solicitation", "tempo", "publicity", "setup", "vista", "hallway", "whisky", "mishap", "oasis", "anthropology", "archery", "seating", "boomer", "emperor", "quantity", "ascent", "tuesday", "deference"], "cities": ["minot", "ambleside", "wolverton and greenleys", "devizes", "stretford", "jeffersonville", "fort worth", "new braunfels", "didcot", "upton-upon-severn", "compton", "fakenham", "harlow", "looe", "maidenhead", "uckfield", "mysen", "ytrebygda", "the hammocks", "el cajon", "gaithersburg", "boston", "hesperia", "buffalo grove", "hemel hempstead", "chapel hill", "mount prospect", "ivybridge", "allentown", "apple valley", "gary", "helston", "murray", "ashton-under-lyne", "greater willington", "mossley", "hebden royd", "middlewich", "sutton", "south bend", "rocklin", "berwick-upon-tweed", "minneapolis", "tulsa", "east cowes", "barnstable town", "brookhaven", "lakeland", "burleson", "wilmington", "ashford", "newhaven", "roseville", "arden-arcade", "garden grove", "beverley", "roswell", "hereford", "ogden", "luton", "mesquite", "houghton regis", "peterborough", "patchway", "sugar land", "gardena", "lombard", "livonia", "arcadia", "aldershot", "goole", "sturminster newton", "clay cross", "camden", "bilston", "kingston upon hull", "wainfleet all saints", "fazeley", "aurora", "north richland hills", "ilford", "painswick", "thirsk", "rochester", "snodland", "erie", "perris", "loddon", "menifee", "st blaise", "everett", "tickhill", "fleet", "mo i rana", "kesgrave", "watford", "royal wootton bassett", "launceston", "appleby-in-westmorland", "paignton", "colchester", "logan", "wendover", "milpitas", "surprise", "sarasota", "winchelsea", "owensboro", "wantage", "sogne", "palatine", "stainforth", "daventry", "pembroke pines", "kirkby stephen", "carson city", "holt", "bury st edmunds", "whitchurch", "mitcham", "winchcombe", "akrehamn", "berwyn", "scunthorpe", "bowie", "wyoming", "keswick", "waltham cross", "vadso", "germantown", "bradninch", "bacup", "lostwithiel", "rockford", "welwyn garden city", "pawtucket", "dublin", "steyning", "raunds", "palm coast", "great dunmow", "bartlett", "farmington", "shepton mallet", "willesden", "freeport", "berkeley", "strongsville", "salinas", "loughton", "woodstock", "weymouth town", "frodsham", "skelton-in-cleveland", "levittown", "haywards heath", "philadelphia", "alnwick", "moline", "altoona", "savannah", "bryne", "lydney", "west ham", "romford", "hemet", "frinton and walton", "cheektowaga", "stalybridge", "aspen hill", "jupiter", "crewe", "university", "columbus", "shifnal", "north port", "rockwall", "new orleans", "euclid", "horwich", "maldon", "trenton", "newcastle upon tyne", "southwell", "gulfport", "flower mound", "sarpsborg", "rocky mount", "downham market", "ellesmere port", "arlington heights", "wigan", "el paso", "amarillo", "banbury", "chorley", "featherstone", "corpus christi", "sandiacre", "hampton", "chelmsford", "santee", "dursley", "faversham", "poole", "tustin", "rosemead", "gloucester", "wells", "wigton", "chicago", "radstock", "oshkosh", "hartford", "west hartford", "witney", "keller", "sanford", "axbridge", "hommersak", "exeter", "odessa", "santa ana", "buckeye", "dawley", "fremont", "milford", "pharr", "woodbridge", "bath", "middleton", "pateley bridge", "covina", "bountiful", "bayonne", "sevenoaks", "bradley stoke", "new bedford", "duluth", "sandown", "market bosworth", "ripley", "nailsea", "tonbridge", "renton", "the woodlands", "naperville", "youngstown", "southsea", "kokomo", "lubbock", "madera", "heywood", "birchwood", "torrance", "jackson", "newton", "dinnington st john's", "horsham", "sacramento", "corby", "silver spring", "bridport", "napa", "cedar hill", "fort wayne", "euless", "elland", "sheboygan", "barrow-in-furness", "milton keynes", "charleston", "plantation", "doral", "bushey", "brockton", "burton upon trent", "malmesbury", "maricopa", "ludgershall", "fetsund", "norwich", "rancho cucamonga", "stanley", "horncastle", "wickham", "levanger", "brierfield", "pensacola", "lansing", "davie", "shrewsbury", "egersund", "chulmleigh", "birkenhead", "newbiggin-by-the-sea", "stafford", "vestby", "blackwater and hawley", "margate", "bryan", "bradford", "new milton", "camelford", "sudbury", "greenwood", "loveland", "baton rouge", "chino hills", "gainesville", "epworth", "iowa city", "rialto", "desborough", "fayetteville", "bracknell", "hessle", "bellflower", "flint", "farmington hills", "tring", "manchester", "rowlett", "eden prairie", "rugby", "wokingham", "kopervik", "faringdon", "anchorage", "appleton", "immingham", "st. cloud", "carmichael", "hexham", "longmont", "sale", "greenville", "oak lawn", "louisville/jefferson county", "horsforth", "sedbergh", "smyrna", "brading", "spring", "fort pierce", "millom", "salcombe", "watlington", "wellington", "cape coral", "frederick", "belleville", "driffield", "lexington-fayette", "alafaya", "port st. lucie", "sandwich", "stourbridge", "castleford", "silloth", "potomac", "thornaby-on-tees", "lytham st annes", "clevedon", "henley-in-arden", "san bernardino", "methuen town", "woodley", "sandefjord", "chatteris", "harrisburg", "meltham", "stone", "lehi", "hicksville", "visalia", "middleham", "penryn", "kingston-upon-thames", "coachella", "crediton", "pine bluff", "marlborough", "warner robins", "tigard", "larvik", "texas city", "worthing", "stony stratford", "fredrikstad", "askoy", "towcester", "san francisco", "alpharetta", "mere", "voss", "arvada", "morecambe", "long beach", "new brunswick", "kempston", "cincinnati", "tynemouth", "shreveport", "bicester", "corsham", "ashby woulds", "clitheroe", "market rasen", "walsall", "withernsea", "colburn", "haugesund", "redondo beach", "dereham", "lee's summit", "detroit", "college station", "cricklade", "ipswich", "redmond", "downers grove", "ledbury", "richmond", "todmorden", "aldeburgh", "nottingham", "lawton", "baltimore", "ludlow", "moore", "brightlingsea", "jefferson city", "namsos", "evansville", "muncie", "raleigh", "perth amboy", "verwood", "winchester", "wotton-under-edge", "spokane", "south woodham ferrers", "marazion", "norwalk", "kenner", "newquay", "kirkbymoorside", "maghull", "south cave", "lichfield", "cranbrook", "newton abbot", "nantwich", "sheringham", "somerville", "torquay", "franklin", "gilbert", "vennesla", "chichester", "atlanta", "danbury", "loughborough", "gjovik", "alfreton", "olympia", "fresno", "penrith", "dayton", "desoto", "seaford", "harrogate", "barnoldswick", "yarmouth", "maryport", "east retford", "lechlade", "south elmsall", "bakersfield", "brumunddal", "rowland heights", "ramsgate", "parker", "cambridge", "oakengates", "oxford", "temecula", "heanor and loscoe", "grand rapids", "laguna niguel", "havant", "huntington beach", "watton", "malvik", "carson", "longview", "victorville", "fountainebleau", "halden", "vineland", "otley", "padstow", "tetbury", "salina", "darley dale", "warrington", "mount pleasant", "gillingham", "tampa", "newport beach", "la habra", "meriden", "middlesbrough", "city of london", "glenview", "dekalb", "spilsby", "caistor", "coventry", "ashby-de-la-zouch", "hempstead", "wirksworth", "volda", "grantham", "brampton", "bodo", "burnham-on-crouch", "notodden", "clovis", "filey", "chino", "lodi", "lutterworth", "stockton", "grand junction", "calne", "carterton", "wood green", "north hykeham", "tisbury", "brigg", "drammen", "morley", "south molton", "blackburn", "raholt", "sandy springs", "castro valley", "irondequoit", "dorking", "burgess hill", "askim", "ann arbor", "seaham", "west bromwich", "conroe", "sayreville", "stalbridge", "minehead", "elverum", "drobak", "rawtenstall", "portland", "harstad", "scranton", "albany", "workington", "denton", "north las vegas", "jersey city", "battle", "brighouse", "north bethesda", "redding", "cowes", "melksham", "hingham", "delano", "sutton coldfield", "cypress", "tallahassee", "bishop's stortford", "lakewood", "tidworth", "brentford", "snaith and cowick", "stowmarket", "wymondham", "arlesey", "ormskirk", "yakima", "las vegas", "southaven", "chester-le-street", "hythe", "palm desert", "dartford", "trowbridge", "floro", "wareham", "holmestrand", "sandy", "dronfield", "winslow", "kirkby lonsdale", "seattle", "croydon", "tananger", "conway", "glossop", "colyton", "bury", "spennymoor", "reepham", "camborne", "portsmouth", "fauske", "azusa", "bridlington", "shirebrook", "twin falls", "schenectady", "newark", "porterville", "evesham", "bergen", "elstree and borehamwood", "town 'n' country", "high point", "thornbury", "kington", "dartmouth", "taylor", "ramsey", "port charlotte", "st. peters", "plainfield", "eagan", "avondale", "normal", "dale city", "west jordan", "san antonio", "missouri city", "syracuse", "coon rapids", "pocatello", "pflugerville", "fordbridge", "twickenham", "olathe", "leek", "davis", "anderson", "andover", "north tawton", "westfield", "hillsboro", "poway", "millcreek", "idaho falls", "rochford", "cinderford", "salem", "stanhope", "canvey island", "longridge", "selby", "henley-on-thames", "dukinfield", "knoxville", "centreville", "janesville", "carrollton", "novato", "corbridge", "northleach with eastington", "grand prairie", "new mills", "walthamstow", "erith", "bishop's castle", "sioux city", "folsom", "honefoss", "new haven", "greeley", "alexandria", "amersham", "pittsburgh", "eau claire", "royal oak", "boroughbridge", "truro", "south shields", "wivenhoe", "vancouver", "honolulu", "catalina foothills", "preston", "ware", "casas adobes", "west tilbury", "west des moines", "tuscaloosa", "beavercreek", "burslem", "harpenden", "cupertino", "bowling green", "liverpool", "princes risborough", "rochdale", "chickerell", "downey", "little rock", "chicopee", "east honolulu", "carlsbad", "sioux falls", "danville", "oswestry", "normanton", "somerton", "pomona", "columbia", "hamar", "la mesa", "san ramon", "clearwater", "camarillo", "haxby", "hungerford", "prescot", "riverton", "worksop", "castle rock", "east providence", "leigh", "manningtree", "crewkerne", "toms river", "askern", "attleboro", "apex", "irthlingborough", "south hill", "tewkesbury", "hammond", "lake charles", "orford", "macon-bibb county", "woburn", "ashbourne", "fairfield", "leirvik", "bulwell", "callington", "plymouth", "kennewick", "mablethorpe and sutton", "wadebridge", "totnes", "missoula", "hayle", "league city", "taunton", "state college", "bedworth", "castle cary", "porsgrunn", "rayleigh", "tamworth", "bishop auckland", "moreton-in-marsh", "charlbury", "lake elsinore", "santa monica", "ripon", "knaresborough", "mansfield", "teignmouth", "ilkeston", "cramlington", "westhoughton", "san buenaventura (ventura)", "simi valley", "auburn", "burgh-le-marsh", "boynton beach", "solihull", "petaluma", "egremont", "bude-stratton", "yuba city", "des moines", "terre haute", "brierley", "flekkefjord", "stratford-upon-avon", "amesbury", "fareham", "harworth and bircotes", "pinellas park", "wakefield", "ottery st mary", "corvallis", "lompoc", "pickering", "darlington", "cullompton", "great torrington", "roanoke", "el monte", "uppingham", "woodland", "porthleven", "yucaipa", "valdosta", "brownsville", "pershore", "sunnyvale", "ellicott city", "thatcham", "galveston", "stroud", "eastbourne", "staines-upon-thames", "cleethorpes", "manteca", "st. petersburg", "metairie", "st helens", "joliet", "walton-on-thames", "san jacinto", "march", "crowle", "hoddesdon", "st mawes", "schaumburg", "rancho palos verdes", "carlton colville", "tow law", "halstead", "deal", "biloxi", "mobile", "joplin", "casper", "brixham", "lowestoft", "jessheim", "bebington", "oceanside", "burke", "totton and eling", "clifton", "kidderminster", "goodyear", "mayaguez", "bloomington", "kentwood", "sunrise manor", "newent", "modesto", "grays", "west palm beach", "cheyenne", "redditch", "altamonte springs", "orange", "burford", "fort myers", "thetford", "bromborough", "frome", "sierra vista", "bothell", "miramar", "leicester", "whitworth", "richland", "altadena", "slough", "fordingbridge", "finchley", "eastleigh", "new romney", "miami", "tacoma", "paddock wood", "cromer", "pine hills", "south san francisco", "bognor regis", "cirencester", "wooler", "partington", "waukesha", "accrington", "burnley", "st just-in-penwith", "dunwoody", "flagstaff", "ealing", "helmsley", "tonsberg", "okehampton", "klofta", "kannapolis", "elizabeth", "antioch", "witham", "whitnash", "port arthur", "st. paul", "alston", "santa rosa", "molde", "market weighton", "ringwood", "evanston", "grimstad", "bromsgrove", "coleford", "hayward", "san diego", "cleveland heights", "palm harbor", "church stretton", "potton", "new rochelle", "flitwick", "dover", "mishawaka", "north miami beach", "provo", "southampton", "east lansing", "nashua", "whitehill", "stavern", "chatham", "hawthorne", "braintree", "virginia beach", "arlington", "milwaukee", "pueblo", "malden", "fort collins", "lincoln", "kirkham", "greensboro", "cicero", "hutchinson", "steinkjer", "hunstanton", "chula vista", "carnforth", "buntingford", "northfleet", "suffolk", "st. louis", "plano", "billings", "mcallen", "elyria", "cockermouth", "hollywood", "wincanton", "west haven", "ankeny", "holbeach", "vacaville", "ilkley", "taylorsville", "whittlesey", "alesund", "hacienda heights", "chapel-en-le-frith", "ongar", "colton", "cheadle", "romsey", "minster", "skelmersdale", "quincy", "redcar", "morpeth", "chico", "coral gables", "wesley chapel", "glendale", "commerce city", "upland", "dearborn heights", "wetherby", "stalham", "severn", "cannock", "santa fe", "haslingden", "rio rancho", "broughton", "indianapolis", "augusta-richmond county", "hackensack", "berkhamsted", "hartlepool", "independence", "portishead and north weston", "yate", "west lafayette", "broseley", "colorado springs", "lynn", "trujillo alto", "beccles", "northallerton", "scottsdale", "new york", "west sacramento", "west covina", "overland park", "bottesford", "as", "austin", "champaign", "cantebury", "frisco", "ventnor", "south valley", "cleobury mortimer", "hartland", "rye", "dulverton", "irvine", "bel air south", "wylie", "chard", "edina", "fowey", "lydd", "waukegan", "kirkland", "burlington", "honiton", "delray beach", "trondheim", "jonesboro", "wath-upon-dearne", "keynsham", "tamiami", "shefford", "houston", "abilene", "higham ferrers", "east hartford", "alhambra", "bakewell", "leyburn", "rochester hills", "grand island", "north charleston", "ferryhill", "maple grove", "waltham abbey", "marietta", "hedon", "collierville", "enterprise", "blandford forum", "lauderhill", "florin", "southwold", "st austell", "meridian", "ocala", "chipping campden", "kirkby-in-ashfield", "felixstowe", "poinciana", "mirfield", "melton mowbray", "maidstone", "whitehaven", "mclean", "el centro", "aylsham", "aylesbury", "bridgeport", "blackpool", "revere", "binghamton", "thame", "midwest city", "thornton", "buckingham", "hendon", "nampa", "peoria", "westminster", "macclesfield", "fishers", "hyde", "ashburton", "madison", "redlands", "country club", "rothwell", "hedge end", "marysville", "davenport", "abingdon", "eton", "st columb major", "rotherham", "carmel", "south jordan", "tonawanda", "providence", "cleveland", "earley", "hammerfest", "aspatria", "southborough", "paterson", "lake ridge", "dunstable", "daytona beach", "buena park", "whaley bridge", "littlehampton", "san angelo", "tulare", "darwen", "wickwar", "alameda", "florissant", "chesterfield", "rancho santa margarita", "parma", "charlottesville", "glendora", "highworth", "dubuque", "bolsover", "rancho cordova", "uxbridge", "adlington", "broadstairs and st peter's", "stourport-on-severn", "san marcos", "san rafael", "lacey", "santa barbara", "portage", "dalton town with newton", "nashville-davidson", "midhurst", "barton-upon-humber", "troy", "ferndown", "redruth", "oundle", "ryde", "midland", "oldham", "fort lauderdale", "weston", "tracy", "willenhall", "ponce", "urbana", "eye", "woodbury", "wells-next-the-sea", "northampton", "pompano beach", "clun", "nuneaton", "o'fallon", "edgware", "eastwood", "baytown", "penwortham", "sterling heights", "hednesford", "longtown", "barnes", "bellevue", "moss", "watsonville", "monroe", "pearl city", "swanscombe and greenhithe", "newport", "exmouth", "west mersea", "market deeping", "san juan", "bethesda", "kingsbridge", "axminster", "ulsteinvik", "conisbrough", "monterey park", "daly city", "pocklington", "scarborough", "oldbury", "gateshead", "mount vernon", "winsford", "bingley", "blacksburg", "jurupa valley", "waltham", "barnard castle", "halesworth", "bruton", "petworth", "arendal", "skien", "hoffman estates", "great falls", "ontario", "temple", "godmanchester", "seaton", "raufoss", "elgin", "newton-le-willows", "wallasey", "beaconsfield", "mesa", "stillwater", "bridgwater", "chipping norton", "middletown", "shepshed", "neston", "lillehammer", "sandhurst", "beaverton", "orlando", "highlands ranch", "kirton-in-lindsey", "sidmouth", "st. louis park", "kimberley", "mildenhall", "newark-on-trent", "south whittier", "san tan valley", "royston", "medlar with wesham", "birmingham", "billericay", "turlock", "southall", "leatherhead", "norfolk", "hertford", "saffron walden", "brackley", "shoreham-by-sea", "san clemente", "lafayette", "kalamazoo", "budleigh salterton", "pasadena", "enfield", "orem", "barnet", "belper", "montebello", "burntwood", "palm bay", "santa maria", "miami beach", "buxton", "farnham", "wisbech", "littleton", "findlay", "burbank", "bollington", "ampthill", "murfreesboro", "stratford", "deltona", "st albans", "lewisville", "cedar park", "kenosha", "madeley", "hatherleigh", "windsor", "utica", "lewes", "rowley regis", "st. george", "maltby", "north highlands", "melbourne", "kendal", "crowborough", "fordwich", "encinitas", "paradise", "letchworth garden city", "waipahu", "warren", "southfield", "coulsdon", "escondido", "peacehaven", "royal tunbridge wells", "cary", "walnut creek", "dundalk", "long sutton", "towson", "nailsworth", "rohnert park", "pittsfield", "toledo", "dothan", "brighton & hove", "bournemouth", "tadcaster", "battle creek", "dudley", "wallingford", "cerritos", "cutler bay", "huntington", "aloha", "garstang", "lyme regis", "stonehouse", "keighley", "bedale", "framingham", "coeur d'alene", "eccles", "east grinstead", "burton latimer", "west malling", "palmdale", "kenilworth", "layton", "acton", "tadley", "north petherton", "wellingborough", "east orange", "chingford", "stoke-on-trent", "blyth", "southam", "peterlee", "newmarket", "shoreline", "westerham", "tamarac", "sandnessjoen", "riverside", "annandale", "omaha", "waterbury", "draper", "tiverton", "atascocita", "west bedlington", "burnsville", "rogers", "buckfastleigh", "lakeville", "brookline", "leesburg", "bedford", "wragby", "billingham", "pontefract", "wichita", "york", "east ham", "bodmin", "gresham", "st. charles", "livermore", "louth", "durham", "victoria", "antelope", "westland", "leigh-on-sea", "cotgrave", "chesapeake", "winston-salem", "union city", "hendersonville", "lorain", "santa clarita", "palm beach gardens", "wheaton", "emsworth", "weybridge", "bovey tracey", "masham", "boise city", "eastvale", "oakland park", "lillestrom", "chippenham", "stjordalshalsen", "moreno valley", "indio", "kettering", "weston-super-mare", "bawtry", "mckinney", "epping", "haltwhistle", "norton-on-derwent", "coleshill", "boulder", "pontiac", "bungay", "nesoddtangen", "city of westminster", "spalding", "dagenham", "windermere", "coconut creek", "bend", "oklahoma city", "mission", "hailsham", "chorleywood", "stavanger", "staveley", "newport pagnell", "bellingham", "basingstoke", "horten", "san luis obispo", "midsomer norton", "lynchburg", "clare", "queenborough-in-sheppey", "arundel", "derby", "waterloo", "burien", "inglewood", "prudhoe", "clarksville", "hamilton", "kristiansand", "odda", "shaftesbury", "blackrod", "bradenton", "fall river", "tavistock", "oakland", "shanklin", "swaffham", "amble", "huntsville", "la mirada", "dovercourt", "chudleigh", "buffalo", "niagara falls", "summerville", "widnes", "medford", "batley", "north walsham", "coggeshall", "edmonton", "telford", "west valley city", "pleasanton", "westbury", "corringham", "sammamish", "ashburn", "barking", "newport news", "broomfield", "guildford", "ossett", "saltash", "olney", "sparks", "glen burnie", "thorne", "wilton", "oakham", "chipping sodbury", "craven arms", "national city", "henderson", "bolton", "sandnes", "tenterden", "kragero", "fullerton", "federal way", "sogndal", "rapid city", "the villages", "centennial", "coral springs", "leiston", "cuyahoga falls", "basildon", "hinckley", "huntersville", "northam", "smethwick", "thorpe st andrew", "linden", "stow-on-the-wold", "rock hill", "skipton", "beaminster", "liskeard", "ponteland", "wilson", "northwich", "wauwatosa", "wiveliscombe", "strood", "indre arna", "colne", "blaine", "salt lake city", "rugeley", "bonita springs", "fond du lac", "king's lynn", "winterton", "stotfold", "st ives", "oak park", "hoover", "edmond", "hermansverk", "moretonhampstead", "newlyn", "southgate", "boca raton", "elk grove", "yuma", "kidsgrove", "wembley", "syston", "bourne", "eccleshall", "oslo", "haltom city", "hemsworth", "carshalton", "high wycombe", "falmouth", "shawnee", "lancaster", "bromley", "hornsey", "jarrow", "kendale lakes", "hoboken", "easingwold", "bentonville", "loftus", "johnson city", "council bluffs", "harwich", "dawlish", "cedar rapids", "bishop's waltham", "hatfield", "southend-on-sea", "rushden", "akron", "manhattan", "leominster", "preesall", "guisborough", "tucson", "la crosse", "warminster", "wolsingham", "grapevine", "south petherton", "market harborough", "ski", "reno", "knutsford", "haverhill", "montgomery", "ross-on-wye", "sandbach", "kongsvinger", "san mateo", "san jose", "cranston", "uttoxeter", "acle", "atherstone", "halesowen", "wimborne minster", "bell gardens", "stocksbridge", "bismarck", "mentor", "stockport", "st. joseph", "bolingbrook", "southport", "stamford", "west allis", "beaumont", "minchinhampton", "chattanooga", "cheshunt", "bletchley and fenny stratford", "bayamon", "broughton-in-furness", "corona", "reading", "alford", "sawbridgeworth", "florence-graham", "arecibo", "lehigh acres", "costa mesa", "caldwell", "marlow", "mosjoen", "hornsea", "waldorf", "market drayton", "fleetwood", "spring hill", "whitby", "hattiesburg", "tempe", "morgan hill", "reston", "swindon", "new britain", "filton", "great yarmouth", "johns creek", "carolina", "lynton and lynmouth", "round rock", "alcester", "bradford-on-avon", "kansas city", "west seneca", "swanage", "west babylon", "kendall", "kongsberg", "grimsby", "godalming", "deerfield beach", "casa grande", "narvik", "lake havasu city", "ceres", "lynwood", "tenbury wells", "southwick", "tuckahoe", "alton", "matlock", "tottenham", "saginaw", "pasco", "soham", "yateley", "oxnard", "torpoint", "warwick", "mitcheldean", "watchet", "san leandro", "saxmundham", "verdal", "st mary cray", "wimbledon", "spring valley", "diss", "chester", "penkridge", "langport", "bristol", "christchurch", "palm springs", "holsworthy", "needham market", "lillesand", "north miami", "port orange", "chagford", "braunstone town", "norman", "garland", "novi", "harrisonburg", "chandler", "much wenlock", "athens-clarke county", "jorpeland", "poynton-with-worth", "santa clara", "paramount", "apopka", "albuquerque", "haslemere", "carlisle", "phoenix", "huntingdon", "barnsley", "diamond bar", "petersfield", "dorchester", "hastings", "dearborn", "charlotte", "lawrence", "palo alto", "huntington park", "hialeah", "homestead", "lenexa", "concord", "kristiansund", "penistone", "pudsey", "framlingham", "reigate", "selsey", "yarm", "lake forest", "beckenham", "denver", "oro valley", "biddulph", "blue springs", "woking", "cheltenham", "fort smith", "biggleswade", "penzance", "canton", "white plains", "gainsborough", "south gate", "brentwood", "hetton", "pico rivera", "sherborne", "bideford", "crawley", "thaxted", "catonsville", "eugene", "kissimmee", "bewdley", "droitwich spa", "fontana", "gravesend", "mexborough", "vallejo", "settle", "bozeman", "heathfield", "burnham-on-sea and highbridge", "guaynabo", "bromyard and winslow", "mission viejo", "malton", "crosby", "kent", "memphis", "newcastle-under-lyme", "stevenage", "riverview", "chesham", "ellesmere", "brandon", "kearny", "folkestone", "citrus heights", "ilfracombe", "peabody", "minnetonka", "bethlehem", "wallsend", "orland park", "bingham", "green bay", "caguas", "surbiton", "springdale", "washington", "aliso viejo", "racine", "thousand oaks", "noblesville", "cathedral city", "stapleford", "placentia", "north lauderdale", "gosport", "ollerton and boughton", "shildon", "largo", "southminster", "sleaford", "ilminster", "telscombe", "yeovil", "topeka", "leeds", "harrow", "allen", "st. clair shores", "redwood city", "hitchin", "horley", "nelson", "newbury", "mandal", "doncaster", "salford", "ashington", "glastonbury", "new alresford", "fountain valley", "kingsport", "wadhurst", "hilo", "gorleston", "bridgnorth", "howden", "royal leamington spa", "lowell", "harlingen", "hanford", "gastonia", "edenbridge", "tranby", "shipston-on-stour", "south kirkby and moorthorpe", "weymouth", "barnstaple", "rothbury", "thrapston", "enid", "hadleigh", "baldwin park", "irving", "edinburg", "richardson", "jacksonville", "dallas", "yorba linda", "skokie", "bexley", "congleton", "north little rock", "las cruces", "ely", "miami gardens", "broken arrow", "elkhart", "dunwich", "leyton", "pittsburg", "redenhall with harleston", "san bruno", "santa cruz", "pearland", "skegness", "forde", "highland", "los angeles", "earl shilton", "ingleby barwick", "el dorado hills", "grange-over-sands", "georgetown", "alta", "passaic", "gilroy", "attleborough", "silsden", "asheville", "stockton-on-tees", "fairford", "murrieta", "yonkers", "polegate", "titusville", "wichita falls", "des plaines", "halifax", "sunrise", "spokane valley", "alsager", "chertsey", "padiham", "orsta", "bentham", "anaheim", "whittier", "tromso", "west new york", "tipton", "elmhurst", "cleator moor", "woburn sands", "tinley park", "altrincham", "east los angeles", "springfield", "dewsbury", "ames", "urbandale", "fargo", "sunderland", "topsham", "killeen", "sheffield", "wem", "rockville", "leighton-linslade", "swanley", "laredo", "st neots", "sittingbourne", "huddersfield", "bexhill-on-sea", "brooklyn park", "salisbury", "bossier city", "decatur", "tyler", "malvern", "waco", "crowland", "mountain view", "bootle", "vista", "merced", "grand forks", "ulverston", "worcester"]} \ No newline at end of file diff --git a/kb.py b/kb.py new file mode 100644 index 0000000..faa77f6 --- /dev/null +++ b/kb.py @@ -0,0 +1,159 @@ +""" +AQE: A Query Engine + +This is a proof of concept of a baseline query engine for AI work. +""" + +class InvalidQuery(Exception): + pass + +class Inconsistency(Exception): + def __init__(self, fact): + self.fact = fact + + def __str__(self): + return 'Inconsistency: {}'.format(self.fact) + +class KnowledgeBase: + + def __init__(self): + # TODO(kyle): support loading an initial set of facts. + self.__kb__ = {} + self.__facts__ = set() + + def tell(self, fact): + relationship, subject, obj = fact + + # NB: in the future, these assertions may not need to be true; there + # might be space in the world for "fuzzy" facts. + assert(relationship) + assert(subject) + assert(obj) + if relationship not in self.__kb__: + self.__kb__[relationship] = {'subjects':{}, 'objects': {}} + + if subject not in self.__kb__[relationship]['subjects']: + self.__kb__[relationship]['subjects'][subject] = set() + self.__kb__[relationship]['subjects'][subject].add(obj) + + if obj not in self.__kb__[relationship]['objects']: + self.__kb__[relationship]['objects'][obj] = set() + self.__kb__[relationship]['objects'][obj].add(subject) + self.__facts__.add(fact) + + def retract(self, fact): + relationship, subject, obj = fact + + # For now, these assertions are required. In the future, it would be + # interesting to say something to the effect of "forget everything you + # know about X". + assert(relationship) + assert(subject) + assert(obj) + + # TODO(kyle): answer existential question: if I delete all the objects + # from a subject (or vice versa), should that subject/object be kept or + # removed entirely? This is the difference between "I have no concept + # of X" and "I am aware that X exists but I don't know anything about it". + # For now, I'm electing to keep the entry. + # + # Similarly, if the relationship is empty, we could make the argument + # for removing it --- at the expense of now saying that we have no + # concept of this relationship. + try: + self.__kb__[relationship]['subjects'][subject].remove(obj) + self.__kb__[relationship]['objects'][obj].remove(subject) + self.__facts__.remove(fact) + except KeyError: + # Being told to forget something about something you don't know + # isn't an error. + pass + pass + + def ask(self, fact): + relationship, subject, obj = fact + + # A future milestone will remove this requirement to support free + # variables. + assert(relationship) + + if relationship and subject and obj: + if fact in self.__facts__: + return [fact,] + return [] + + if relationship and subject: + return [(relationship, subject, _obj) for _obj + in self.__kb__[relationship]['subjects'][subject]] + + if relationship and obj: + return [(relationship, _subject, obj) for _subject + in self.__kb__[relationship]['objects'][obj]] + + def facts(self): + return list(self.__facts__) + + def is_consistent(self): + try: + for fact in self.__facts__: + relationship, subject, obj = fact + if obj not in self.__kb__[relationship]['subjects'][subject]: + raise Inconsistency(fact) + if subject not in self.__kb__[relationship]['objects'][obj]: + raise Inconsistency(fact) + + for relationship, v in self.__kb__.items(): + for subject in v['subjects'].keys(): + for obj in v['subjects'][subject]: + if (relationship, subject, obj) not in self.__facts__: + raise Inconsistency(fact) + + for obj in v['objects'].keys(): + for subject in v['objects'][obj]: + if (relationship, subject, obj) not in self.__facts__: + raise Inconsistency(fact) + except KeyError: + raise Inconsistency(fact) + + return True + + def __len__(self): + return len(self.__facts__) + + def subst(self, fact, subject, obj): + relationship, _subject, _obj = fact + if _subject is None: + _subject = subject + if _subject == '?any': + _subject = None + elif _subject == '?subject': + _subject = subject + elif _subject == '?object': + _subject = obj + + if _obj is None: + _obj = obj + if _obj == '?any': + _obj = None + elif _obj == '?subject': + _obj = subject + elif _obj == '?object': + _obj = obj + + if _subject == '?current': + possibilities = self.ask((relationship, None, _obj)) + assert(len(possibilities) == 1) + _, _subject, _ = possibilities[0] + elif _obj == '?current': + possibilities = self.ask((relationship, subject, None)) + assert(len(possibilities) == 1) + _, _, _obj = possibilities[0] + + return (relationship, _subject, _obj) + + +def from_facts(facts): + kb = KnowledgeBase() + for fact in facts: + kb.tell(fact) + return kb diff --git a/sample.py b/sample.py new file mode 100644 index 0000000..bc25ed4 --- /dev/null +++ b/sample.py @@ -0,0 +1,47 @@ +import base64 +import itertools +import json +import kb +import pickle +import random + +FACTS = """ +gANdcQAoWAIAAABpc3EBWAgAAABhaXJsaW5lcnECWAUAAABGbHllcnEDh3EEaAFYBwAAAG9ha2xh +bmRxBVgHAAAAQWlycG9ydHEGh3EHaAFoBVgEAAAAQ2l0eXEIh3EJaAFYBgAAAGRlbnZlcnEKaAaH +cQtoAWgKaAiHcQxoAVgGAAAAY2JyNjAwcQ1YBgAAAERyaXZlcnEOh3EPaAFYBwAAAHRyb29wZXJx +EGgOh3ERWAIAAABhdHESaAJoCodxE2gSaA1oBYdxFGUu +""" + +def load(): + facts = base64.decodebytes(FACTS.encode('ascii')) + facts = pickle.loads(facts) + skb = kb.KnowledgeBase() + for fact in facts: + skb.tell(fact) + + return skb + +def load_facts(corpus_path='data/corpus.json', is_count=1000000): + facts = set() + corpus = json.loads(open(corpus_path).read()) + if 'nouns' in corpus and 'adjectives' in corpus: + perms = list(itertools.product(corpus['nouns'], + corpus['adjectives'])) + if len(perms) < is_count: + is_count = len(perms)-1; + pool = random.choices(perms, k=is_count) + for noun, adjective in pool: + facts.add(('is', noun, adjective)) + + if 'cities' in corpus: + for city in corpus['cities']: + facts.add(('is', city, 'City')) + + return facts + +def generate_tail_number(): + letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + tailno = 'N' + str(random.randint(10, 99)) + tailno += random.choice(letters) + tailno += random.choice(letters) + return tailno diff --git a/test_actions.py b/test_actions.py new file mode 100644 index 0000000..91fffbd --- /dev/null +++ b/test_actions.py @@ -0,0 +1,67 @@ +import actions +import kb +import unittest + +INITIAL_FACTS = [ + ('is', 'N29EO', 'Plane'), + ('at', 'N29EO', 'dia'), + ('is', 'N10IV', 'Plane'), + ('at', 'N10IV', 'oak'), + ('is', 'N33FR', 'Plane'), + ('at', 'N33FR', 'lga'), + ('is', '1Z12345E0205271688', 'Package'), + ('at', '1Z12345E0205271688', 'dia'), + ('is', '1Z12345E6605272234', 'Package'), + ('at', '1Z12345E6605272234', 'dia'), + ('is', '1Z12345E0305271640', 'Package'), + ('at', '1Z12345E0305271640', 'oak'), + ('is', '1Z12345E1305277940', 'Package'), + ('at', '1Z12345E1305277940', 'lga'), + ('is', '1Z12345E6205277936', 'Package'), + ('at', '1Z12345E6205277936', 'lga'), + ('is', 'dia', 'Airport'), + ('is', 'lga', 'Airport'), + ('is', 'oak', 'Airport'), +] + +FLY_POS_PRECONDS = [ + ('is', '?subject', 'Plane'), + ('is', '?object', 'Airport'), +] + +FLY_NEG_PRECONDS = [ + ('at', '?subject', '?object'), +] + +FLY_RETRACTIONS = [ + ('at', '?subject', '?current'), +] + +FLY_UPDATES = [ + ('at', '?subject', '?object'), +] + +fly = actions.Action(FLY_POS_PRECONDS, FLY_NEG_PRECONDS, + FLY_RETRACTIONS, FLY_UPDATES) + +class ActionTestSuite(unittest.TestCase): + + def setUp(self): + self.kb = kb.from_facts(INITIAL_FACTS) + + def test_a_flight(self): + self.assertTrue(self.kb.ask(('at', 'N10IV', 'oak'))) + self.assertFalse(self.kb.ask(('at', 'N10IV', 'lga'))) + + shadow = fly.perform(self.kb, 'N10IV', 'lga') + self.assertTrue(shadow) + + # Shadow should reflect the updates and retractions. + self.assertTrue(shadow.ask(('at', 'N10IV', 'lga'))) + self.assertFalse(shadow.ask(('at', 'N10IV', 'oak'))) + + # The original shouldn't be touched. + self.assertTrue(self.kb.ask(('at', 'N10IV', 'oak'))) + self.assertFalse(self.kb.ask(('at', 'N10IV', 'lga'))) + + diff --git a/test_kb.py b/test_kb.py new file mode 100644 index 0000000..ef22d5f --- /dev/null +++ b/test_kb.py @@ -0,0 +1,59 @@ +import copy +import kb +import random +import sample +import unittest + + +class KnowledgeBaseTestSuite(unittest.TestCase): + + def setUp(self): + self.kb = sample.load() + + def test_a_sanity_check(self): + assert(self.kb.is_consistent()) + for fact in self.kb.__facts__: + self.assertTrue(self.kb.ask(fact)) + + def test_tell(self): + new_fact = ('is', 'berkeley', 'City') + + # make sure it's not something we already know + self.assertFalse(self.kb.ask(new_fact)) + self.kb.tell(new_fact) + answer = self.kb.ask(new_fact) + self.assertListEqual(answer, [new_fact,]) + + def test_inconsistency(self): + badkb = copy.deepcopy(self.kb) + badfact = random.choice(badkb.facts()) + relationship, subject, obj = badfact + + # muck with subjects part + badkb.__kb__[relationship]['subjects'][subject].remove(obj) + with self.assertRaises(kb.Inconsistency): + badkb.is_consistent() + + # muck with objects part + badkb = copy.deepcopy(self.kb) + badkb.__kb__[relationship]['objects'][obj].remove(subject) + with self.assertRaises(kb.Inconsistency): + badkb.is_consistent() + + # muck with facts part + badkb = copy.deepcopy(self.kb) + badkb.__facts__.remove(badfact) + with self.assertRaises(kb.Inconsistency): + badkb.is_consistent() + + # inject false data into the subject + badkb = copy.deepcopy(self.kb) + badkb.__kb__[relationship]['subjects'][subject].add('false memory') + with self.assertRaises(kb.Inconsistency): + badkb.is_consistent() + + # inject false data into the object + badkb = copy.deepcopy(self.kb) + badkb.__kb__[relationship]['objects'][obj].add('false memory') + with self.assertRaises(kb.Inconsistency): + badkb.is_consistent() diff --git a/util.py b/util.py new file mode 100644 index 0000000..bd9a796 --- /dev/null +++ b/util.py @@ -0,0 +1,8 @@ +import random + +def generate_tail_number(): + letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + tailno = 'N' + random.randint(10, 99) + tailno += random.choice(letters) + tailno += random.choice(letters) + return tailno