nltk 3.2__zip → 3.3__zip

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (406) hide show
  1. {nltk-3.2 → nltk-3.3}/INSTALL.txt +6 -6
  2. {nltk-3.2 → nltk-3.3}/LICENSE.txt +13 -13
  3. {nltk-3.2 → nltk-3.3}/MANIFEST.in +6 -6
  4. {nltk-3.2/nltk.egg-info → nltk-3.3}/PKG-INFO +13 -5
  5. nltk-3.2/README.txt → nltk-3.3/README.md +49 -48
  6. nltk-3.3/nltk/VERSION +1 -0
  7. {nltk-3.2 → nltk-3.3}/nltk/__init__.py +185 -185
  8. {nltk-3.2 → nltk-3.3}/nltk/app/__init__.py +52 -53
  9. {nltk-3.2 → nltk-3.3}/nltk/app/chartparser_app.py +2276 -2276
  10. {nltk-3.2 → nltk-3.3}/nltk/app/chunkparser_app.py +1262 -1264
  11. {nltk-3.2 → nltk-3.3}/nltk/app/collocations_app.py +347 -350
  12. {nltk-3.2 → nltk-3.3}/nltk/app/concordance_app.py +568 -570
  13. {nltk-3.2 → nltk-3.3}/nltk/app/nemo_app.py +156 -155
  14. {nltk-3.2 → nltk-3.3}/nltk/app/rdparser_app.py +892 -894
  15. {nltk-3.2 → nltk-3.3}/nltk/app/srparser_app.py +809 -809
  16. {nltk-3.2 → nltk-3.3}/nltk/app/wordfreq_app.py +32 -32
  17. {nltk-3.2 → nltk-3.3}/nltk/app/wordnet_app.py +968 -968
  18. {nltk-3.2 → nltk-3.3}/nltk/book.py +91 -90
  19. {nltk-3.2 → nltk-3.3}/nltk/ccg/__init__.py +22 -22
  20. {nltk-3.2 → nltk-3.3}/nltk/ccg/api.py +359 -335
  21. {nltk-3.2 → nltk-3.3}/nltk/ccg/chart.py +394 -361
  22. {nltk-3.2 → nltk-3.3}/nltk/ccg/combinator.py +343 -312
  23. {nltk-3.2 → nltk-3.3}/nltk/ccg/lexicon.py +328 -290
  24. nltk-3.3/nltk/ccg/logic.py +46 -0
  25. {nltk-3.2 → nltk-3.3}/nltk/chat/__init__.py +49 -49
  26. {nltk-3.2 → nltk-3.3}/nltk/chat/eliza.py +244 -244
  27. {nltk-3.2 → nltk-3.3}/nltk/chat/iesha.py +140 -140
  28. {nltk-3.2 → nltk-3.3}/nltk/chat/rude.py +92 -92
  29. {nltk-3.2 → nltk-3.3}/nltk/chat/suntsu.py +117 -117
  30. {nltk-3.2 → nltk-3.3}/nltk/chat/util.py +122 -120
  31. {nltk-3.2 → nltk-3.3}/nltk/chat/zen.py +282 -282
  32. {nltk-3.2 → nltk-3.3}/nltk/chunk/__init__.py +190 -190
  33. {nltk-3.2 → nltk-3.3}/nltk/chunk/api.py +51 -51
  34. {nltk-3.2 → nltk-3.3}/nltk/chunk/named_entity.py +331 -331
  35. {nltk-3.2 → nltk-3.3}/nltk/chunk/regexp.py +1390 -1384
  36. {nltk-3.2 → nltk-3.3}/nltk/chunk/util.py +600 -600
  37. {nltk-3.2 → nltk-3.3}/nltk/classify/__init__.py +98 -98
  38. {nltk-3.2 → nltk-3.3}/nltk/classify/api.py +193 -193
  39. {nltk-3.2 → nltk-3.3}/nltk/classify/decisiontree.py +295 -295
  40. {nltk-3.2 → nltk-3.3}/nltk/classify/maxent.py +1510 -1492
  41. {nltk-3.2 → nltk-3.3}/nltk/classify/megam.py +179 -178
  42. {nltk-3.2 → nltk-3.3}/nltk/classify/naivebayes.py +245 -242
  43. {nltk-3.2 → nltk-3.3}/nltk/classify/positivenaivebayes.py +170 -170
  44. {nltk-3.2 → nltk-3.3}/nltk/classify/rte_classify.py +160 -191
  45. {nltk-3.2 → nltk-3.3}/nltk/classify/scikitlearn.py +153 -151
  46. {nltk-3.2 → nltk-3.3}/nltk/classify/senna.py +183 -181
  47. {nltk-3.2 → nltk-3.3}/nltk/classify/svm.py +15 -15
  48. {nltk-3.2 → nltk-3.3}/nltk/classify/tadm.py +113 -112
  49. {nltk-3.2 → nltk-3.3}/nltk/classify/textcat.py +193 -193
  50. {nltk-3.2 → nltk-3.3}/nltk/classify/util.py +324 -312
  51. {nltk-3.2 → nltk-3.3}/nltk/classify/weka.py +346 -345
  52. {nltk-3.2 → nltk-3.3}/nltk/cluster/__init__.py +86 -86
  53. {nltk-3.2 → nltk-3.3}/nltk/cluster/api.py +74 -70
  54. {nltk-3.2 → nltk-3.3}/nltk/cluster/em.py +247 -247
  55. {nltk-3.2 → nltk-3.3}/nltk/cluster/gaac.py +168 -168
  56. {nltk-3.2 → nltk-3.3}/nltk/cluster/kmeans.py +221 -221
  57. {nltk-3.2 → nltk-3.3}/nltk/cluster/util.py +304 -289
  58. nltk-3.3/nltk/collections.py +640 -0
  59. {nltk-3.2 → nltk-3.3}/nltk/collocations.py +388 -388
  60. nltk-3.3/nltk/compat.py +365 -0
  61. {nltk-3.2 → nltk-3.3}/nltk/corpus/__init__.py +341 -320
  62. {nltk-3.2 → nltk-3.3}/nltk/corpus/europarl_raw.py +44 -44
  63. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/__init__.py +147 -145
  64. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/aligned.py +115 -114
  65. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/api.py +448 -446
  66. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/bnc.py +252 -252
  67. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/bracket_parse.py +227 -227
  68. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/categorized_sents.py +179 -178
  69. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/chasen.py +140 -139
  70. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/childes.py +522 -494
  71. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/chunked.py +212 -212
  72. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/cmudict.py +97 -95
  73. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/comparative_sents.py +280 -278
  74. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/conll.py +528 -521
  75. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/crubadan.py +116 -116
  76. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/dependency.py +101 -101
  77. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/framenet.py +3059 -2093
  78. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ieer.py +112 -111
  79. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/indian.py +85 -86
  80. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ipipan.py +332 -331
  81. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/knbc.py +187 -187
  82. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/lin.py +156 -156
  83. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/mte.py +311 -310
  84. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/nkjp.py +429 -428
  85. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/nombank.py +421 -421
  86. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/nps_chat.py +73 -73
  87. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/opinion_lexicon.py +115 -115
  88. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/panlex_lite.py +165 -165
  89. nltk-3.3/nltk/corpus/reader/pl196x.py +292 -0
  90. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/plaintext.py +232 -233
  91. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ppattach.py +96 -95
  92. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/propbank.py +479 -481
  93. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/pros_cons.py +128 -126
  94. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/reviews.py +330 -328
  95. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/rte.py +144 -146
  96. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/semcor.py +256 -256
  97. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/senseval.py +203 -201
  98. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/sentiwordnet.py +137 -137
  99. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/sinica_treebank.py +75 -75
  100. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/string_category.py +60 -59
  101. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/switchboard.py +119 -119
  102. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/tagged.py +295 -294
  103. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/timit.py +452 -450
  104. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/toolbox.py +68 -68
  105. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/twitter.py +155 -157
  106. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/udhr.py +80 -80
  107. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/util.py +804 -800
  108. nltk-3.3/nltk/corpus/reader/verbnet.py +595 -0
  109. nltk-3.3/nltk/corpus/reader/wordlist.py +134 -0
  110. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/wordnet.py +2108 -2036
  111. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/xmldocs.py +392 -387
  112. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ycoe.py +243 -242
  113. {nltk-3.2 → nltk-3.3}/nltk/corpus/util.py +144 -127
  114. {nltk-3.2 → nltk-3.3}/nltk/data.py +1487 -1451
  115. {nltk-3.2 → nltk-3.3}/nltk/decorators.py +219 -215
  116. {nltk-3.2 → nltk-3.3}/nltk/downloader.py +2278 -2274
  117. {nltk-3.2 → nltk-3.3}/nltk/draw/__init__.py +27 -27
  118. {nltk-3.2 → nltk-3.3}/nltk/draw/cfg.py +774 -777
  119. {nltk-3.2 → nltk-3.3}/nltk/draw/dispersion.py +58 -58
  120. {nltk-3.2 → nltk-3.3}/nltk/draw/table.py +1098 -1098
  121. {nltk-3.2 → nltk-3.3}/nltk/draw/tree.py +963 -966
  122. {nltk-3.2 → nltk-3.3}/nltk/draw/util.py +2356 -2356
  123. {nltk-3.2 → nltk-3.3}/nltk/featstruct.py +2617 -2500
  124. {nltk-3.2 → nltk-3.3}/nltk/grammar.py +1559 -1516
  125. {nltk-3.2 → nltk-3.3}/nltk/help.py +56 -56
  126. {nltk-3.2 → nltk-3.3}/nltk/inference/__init__.py +20 -20
  127. {nltk-3.2 → nltk-3.3}/nltk/inference/api.py +597 -589
  128. {nltk-3.2 → nltk-3.3}/nltk/inference/discourse.py +612 -608
  129. {nltk-3.2 → nltk-3.3}/nltk/inference/mace.py +311 -311
  130. {nltk-3.2 → nltk-3.3}/nltk/inference/nonmonotonic.py +509 -509
  131. {nltk-3.2 → nltk-3.3}/nltk/inference/prover9.py +431 -431
  132. {nltk-3.2 → nltk-3.3}/nltk/inference/resolution.py +687 -687
  133. {nltk-3.2 → nltk-3.3}/nltk/inference/tableau.py +607 -607
  134. {nltk-3.2 → nltk-3.3}/nltk/internals.py +982 -982
  135. {nltk-3.2 → nltk-3.3}/nltk/jsontags.py +63 -63
  136. {nltk-3.2 → nltk-3.3}/nltk/lazyimport.py +142 -142
  137. {nltk-3.2 → nltk-3.3}/nltk/metrics/__init__.py +30 -29
  138. {nltk-3.2 → nltk-3.3}/nltk/metrics/agreement.py +421 -401
  139. nltk-3.3/nltk/metrics/aline.py +607 -0
  140. {nltk-3.2 → nltk-3.3}/nltk/metrics/association.py +414 -410
  141. {nltk-3.2 → nltk-3.3}/nltk/metrics/confusionmatrix.py +206 -206
  142. {nltk-3.2 → nltk-3.3}/nltk/metrics/distance.py +207 -202
  143. {nltk-3.2 → nltk-3.3}/nltk/metrics/paice.py +381 -381
  144. {nltk-3.2 → nltk-3.3}/nltk/metrics/scores.py +228 -228
  145. {nltk-3.2 → nltk-3.3}/nltk/metrics/segmentation.py +231 -232
  146. {nltk-3.2 → nltk-3.3}/nltk/metrics/spearman.py +69 -69
  147. {nltk-3.2 → nltk-3.3}/nltk/misc/__init__.py +11 -11
  148. {nltk-3.2 → nltk-3.3}/nltk/misc/babelfish.py +10 -10
  149. {nltk-3.2 → nltk-3.3}/nltk/misc/chomsky.py +135 -133
  150. {nltk-3.2 → nltk-3.3}/nltk/misc/minimalset.py +83 -83
  151. {nltk-3.2 → nltk-3.3}/nltk/misc/sort.py +157 -157
  152. {nltk-3.2 → nltk-3.3}/nltk/misc/wordfinder.py +129 -129
  153. {nltk-3.2 → nltk-3.3}/nltk/parse/__init__.py +81 -80
  154. {nltk-3.2 → nltk-3.3}/nltk/parse/api.py +66 -66
  155. {nltk-3.2 → nltk-3.3}/nltk/parse/bllip.py +282 -282
  156. {nltk-3.2 → nltk-3.3}/nltk/parse/chart.py +1682 -1681
  157. nltk-3.3/nltk/parse/corenlp.py +780 -0
  158. {nltk-3.2 → nltk-3.3}/nltk/parse/dependencygraph.py +760 -758
  159. {nltk-3.2 → nltk-3.3}/nltk/parse/earleychart.py +452 -451
  160. {nltk-3.2 → nltk-3.3}/nltk/parse/evaluate.py +129 -129
  161. {nltk-3.2 → nltk-3.3}/nltk/parse/featurechart.py +580 -578
  162. {nltk-3.2 → nltk-3.3}/nltk/parse/generate.py +87 -76
  163. {nltk-3.2 → nltk-3.3}/nltk/parse/malt.py +356 -356
  164. {nltk-3.2 → nltk-3.3}/nltk/parse/nonprojectivedependencyparser.py +783 -783
  165. {nltk-3.2 → nltk-3.3}/nltk/parse/pchart.py +522 -522
  166. {nltk-3.2 → nltk-3.3}/nltk/parse/projectivedependencyparser.py +579 -578
  167. {nltk-3.2 → nltk-3.3}/nltk/parse/recursivedescent.py +655 -656
  168. {nltk-3.2 → nltk-3.3}/nltk/parse/shiftreduce.py +458 -459
  169. {nltk-3.2 → nltk-3.3}/nltk/parse/stanford.py +431 -406
  170. {nltk-3.2 → nltk-3.3}/nltk/parse/transitionparser.py +774 -772
  171. {nltk-3.2 → nltk-3.3}/nltk/parse/util.py +231 -231
  172. {nltk-3.2 → nltk-3.3}/nltk/parse/viterbi.py +401 -401
  173. {nltk-3.2 → nltk-3.3}/nltk/probability.py +2410 -2355
  174. {nltk-3.2 → nltk-3.3}/nltk/sem/__init__.py +61 -61
  175. {nltk-3.2 → nltk-3.3}/nltk/sem/boxer.py +1261 -1261
  176. {nltk-3.2 → nltk-3.3}/nltk/sem/chat80.py +782 -782
  177. {nltk-3.2 → nltk-3.3}/nltk/sem/cooper_storage.py +118 -118
  178. {nltk-3.2 → nltk-3.3}/nltk/sem/drt.py +1258 -1257
  179. {nltk-3.2 → nltk-3.3}/nltk/sem/drt_glue_demo.py +485 -489
  180. {nltk-3.2 → nltk-3.3}/nltk/sem/evaluate.py +790 -784
  181. {nltk-3.2 → nltk-3.3}/nltk/sem/glue.py +696 -694
  182. {nltk-3.2 → nltk-3.3}/nltk/sem/hole.py +386 -384
  183. {nltk-3.2 → nltk-3.3}/nltk/sem/lfg.py +210 -208
  184. {nltk-3.2 → nltk-3.3}/nltk/sem/linearlogic.py +451 -449
  185. {nltk-3.2 → nltk-3.3}/nltk/sem/logic.py +1910 -1910
  186. {nltk-3.2 → nltk-3.3}/nltk/sem/relextract.py +476 -483
  187. {nltk-3.2 → nltk-3.3}/nltk/sem/skolemize.py +101 -101
  188. {nltk-3.2 → nltk-3.3}/nltk/sem/util.py +249 -249
  189. {nltk-3.2 → nltk-3.3}/nltk/sentiment/__init__.py +14 -14
  190. {nltk-3.2 → nltk-3.3}/nltk/sentiment/sentiment_analyzer.py +229 -229
  191. {nltk-3.2 → nltk-3.3}/nltk/sentiment/util.py +762 -752
  192. {nltk-3.2 → nltk-3.3}/nltk/sentiment/vader.py +443 -445
  193. {nltk-3.2 → nltk-3.3}/nltk/stem/__init__.py +31 -33
  194. {nltk-3.2 → nltk-3.3}/nltk/stem/api.py +28 -25
  195. nltk-3.3/nltk/stem/arlstem.py +369 -0
  196. {nltk-3.2 → nltk-3.3}/nltk/stem/isri.py +345 -345
  197. {nltk-3.2 → nltk-3.3}/nltk/stem/lancaster.py +337 -310
  198. nltk-3.3/nltk/stem/porter.py +710 -0
  199. {nltk-3.2 → nltk-3.3}/nltk/stem/regexp.py +61 -61
  200. {nltk-3.2 → nltk-3.3}/nltk/stem/rslp.py +142 -142
  201. {nltk-3.2 → nltk-3.3}/nltk/stem/snowball.py +4236 -3712
  202. {nltk-3.2 → nltk-3.3}/nltk/stem/util.py +22 -12
  203. {nltk-3.2 → nltk-3.3}/nltk/stem/wordnet.py +51 -51
  204. {nltk-3.2 → nltk-3.3}/nltk/tag/__init__.py +152 -127
  205. {nltk-3.2 → nltk-3.3}/nltk/tag/api.py +86 -81
  206. {nltk-3.2 → nltk-3.3}/nltk/tag/brill.py +424 -426
  207. {nltk-3.2 → nltk-3.3}/nltk/tag/brill_trainer.py +608 -608
  208. {nltk-3.2 → nltk-3.3}/nltk/tag/crf.py +204 -200
  209. {nltk-3.2 → nltk-3.3}/nltk/tag/hmm.py +1277 -1277
  210. {nltk-3.2 → nltk-3.3}/nltk/tag/hunpos.py +132 -132
  211. {nltk-3.2 → nltk-3.3}/nltk/tag/mapping.py +101 -101
  212. {nltk-3.2 → nltk-3.3}/nltk/tag/perceptron.py +329 -314
  213. {nltk-3.2 → nltk-3.3}/nltk/tag/senna.py +147 -145
  214. {nltk-3.2 → nltk-3.3}/nltk/tag/sequential.py +740 -736
  215. {nltk-3.2 → nltk-3.3}/nltk/tag/stanford.py +219 -196
  216. {nltk-3.2 → nltk-3.3}/nltk/tag/tnt.py +595 -604
  217. {nltk-3.2 → nltk-3.3}/nltk/tag/util.py +72 -72
  218. {nltk-3.2 → nltk-3.3}/nltk/tbl/__init__.py +28 -28
  219. {nltk-3.2 → nltk-3.3}/nltk/tbl/api.py +1 -1
  220. {nltk-3.2 → nltk-3.3}/nltk/tbl/demo.py +366 -366
  221. {nltk-3.2 → nltk-3.3}/nltk/tbl/erroranalysis.py +39 -39
  222. {nltk-3.2 → nltk-3.3}/nltk/tbl/feature.py +259 -261
  223. {nltk-3.2 → nltk-3.3}/nltk/tbl/rule.py +321 -321
  224. {nltk-3.2 → nltk-3.3}/nltk/tbl/template.py +303 -308
  225. {nltk-3.2 → nltk-3.3}/nltk/test/__init__.py +18 -18
  226. {nltk-3.2 → nltk-3.3}/nltk/test/all.py +24 -23
  227. {nltk-3.2 → nltk-3.3}/nltk/test/bleu.doctest +14 -14
  228. {nltk-3.2 → nltk-3.3}/nltk/test/bnc.doctest +60 -60
  229. {nltk-3.2 → nltk-3.3}/nltk/test/ccg.doctest +376 -395
  230. nltk-3.3/nltk/test/ccg_semantics.doctest +553 -0
  231. {nltk-3.2 → nltk-3.3}/nltk/test/chat80.doctest +234 -234
  232. {nltk-3.2 → nltk-3.3}/nltk/test/childes.doctest +184 -184
  233. {nltk-3.2 → nltk-3.3}/nltk/test/childes_fixt.py +14 -13
  234. {nltk-3.2 → nltk-3.3}/nltk/test/chunk.doctest +373 -373
  235. {nltk-3.2 → nltk-3.3}/nltk/test/classify.doctest +185 -185
  236. {nltk-3.2 → nltk-3.3}/nltk/test/classify_fixt.py +11 -10
  237. nltk-3.3/nltk/test/collections.doctest +20 -0
  238. {nltk-3.2 → nltk-3.3}/nltk/test/collocations.doctest +276 -276
  239. {nltk-3.2 → nltk-3.3}/nltk/test/compat.doctest +134 -138
  240. {nltk-3.2 → nltk-3.3}/nltk/test/compat_fixt.py +9 -8
  241. nltk-3.3/nltk/test/concordance.doctest +55 -0
  242. {nltk-3.2 → nltk-3.3}/nltk/test/corpus.doctest +2200 -2212
  243. {nltk-3.2 → nltk-3.3}/nltk/test/corpus_fixt.py +3 -3
  244. {nltk-3.2 → nltk-3.3}/nltk/test/crubadan.doctest +65 -65
  245. {nltk-3.2 → nltk-3.3}/nltk/test/data.doctest +379 -379
  246. {nltk-3.2 → nltk-3.3}/nltk/test/dependency.doctest +241 -241
  247. {nltk-3.2 → nltk-3.3}/nltk/test/discourse.doctest +546 -546
  248. {nltk-3.2 → nltk-3.3}/nltk/test/discourse_fixt.py +14 -13
  249. {nltk-3.2 → nltk-3.3}/nltk/test/doctest_nose_plugin.py +159 -156
  250. {nltk-3.2 → nltk-3.3}/nltk/test/drt.doctest +517 -517
  251. {nltk-3.2 → nltk-3.3}/nltk/test/featgram.doctest +607 -607
  252. {nltk-3.2 → nltk-3.3}/nltk/test/featstruct.doctest +1229 -1230
  253. {nltk-3.2 → nltk-3.3}/nltk/test/framenet.doctest +288 -239
  254. {nltk-3.2 → nltk-3.3}/nltk/test/generate.doctest +67 -67
  255. {nltk-3.2 → nltk-3.3}/nltk/test/gensim.doctest +140 -141
  256. {nltk-3.2 → nltk-3.3}/nltk/test/gensim_fixt.py +10 -9
  257. {nltk-3.2 → nltk-3.3}/nltk/test/gluesemantics.doctest +384 -386
  258. {nltk-3.2 → nltk-3.3}/nltk/test/gluesemantics_malt.doctest +68 -68
  259. {nltk-3.2 → nltk-3.3}/nltk/test/gluesemantics_malt_fixt.py +12 -11
  260. {nltk-3.2 → nltk-3.3}/nltk/test/grammar.doctest +48 -48
  261. {nltk-3.2 → nltk-3.3}/nltk/test/grammartestsuites.doctest +109 -109
  262. {nltk-3.2 → nltk-3.3}/nltk/test/index.doctest +100 -100
  263. {nltk-3.2 → nltk-3.3}/nltk/test/inference.doctest +534 -534
  264. {nltk-3.2 → nltk-3.3}/nltk/test/inference_fixt.py +12 -11
  265. {nltk-3.2 → nltk-3.3}/nltk/test/internals.doctest +140 -140
  266. {nltk-3.2 → nltk-3.3}/nltk/test/japanese.doctest +48 -48
  267. {nltk-3.2 → nltk-3.3}/nltk/test/logic.doctest +1098 -1098
  268. {nltk-3.2 → nltk-3.3}/nltk/test/metrics.doctest +270 -270
  269. {nltk-3.2 → nltk-3.3}/nltk/test/misc.doctest +118 -118
  270. {nltk-3.2 → nltk-3.3}/nltk/test/nonmonotonic.doctest +286 -286
  271. {nltk-3.2 → nltk-3.3}/nltk/test/nonmonotonic_fixt.py +12 -11
  272. {nltk-3.2 → nltk-3.3}/nltk/test/paice.doctest +35 -35
  273. {nltk-3.2 → nltk-3.3}/nltk/test/parse.doctest +884 -884
  274. {nltk-3.2 → nltk-3.3}/nltk/test/portuguese_en.doctest +565 -565
  275. {nltk-3.2 → nltk-3.3}/nltk/test/portuguese_en_fixt.py +16 -16
  276. {nltk-3.2 → nltk-3.3}/nltk/test/probability.doctest +304 -304
  277. {nltk-3.2 → nltk-3.3}/nltk/test/probability_fixt.py +13 -12
  278. {nltk-3.2 → nltk-3.3}/nltk/test/propbank.doctest +176 -176
  279. {nltk-3.2 → nltk-3.3}/nltk/test/relextract.doctest +263 -263
  280. {nltk-3.2 → nltk-3.3}/nltk/test/resolution.doctest +221 -221
  281. {nltk-3.2 → nltk-3.3}/nltk/test/runtests.py +86 -64
  282. {nltk-3.2 → nltk-3.3}/nltk/test/segmentation_fixt.py +10 -10
  283. {nltk-3.2 → nltk-3.3}/nltk/test/semantics.doctest +665 -665
  284. {nltk-3.2 → nltk-3.3}/nltk/test/semantics_fixt.py +7 -7
  285. {nltk-3.2 → nltk-3.3}/nltk/test/sentiment.doctest +233 -233
  286. {nltk-3.2 → nltk-3.3}/nltk/test/sentiwordnet.doctest +41 -41
  287. {nltk-3.2 → nltk-3.3}/nltk/test/simple.doctest +85 -85
  288. {nltk-3.2 → nltk-3.3}/nltk/test/stem.doctest +78 -78
  289. {nltk-3.2 → nltk-3.3}/nltk/test/tag.doctest +33 -33
  290. {nltk-3.2 → nltk-3.3}/nltk/test/tokenize.doctest +273 -166
  291. {nltk-3.2 → nltk-3.3}/nltk/test/toolbox.doctest +307 -307
  292. {nltk-3.2 → nltk-3.3}/nltk/test/translate.doctest +242 -242
  293. {nltk-3.2 → nltk-3.3}/nltk/test/translate_fixt.py +3 -3
  294. {nltk-3.2 → nltk-3.3}/nltk/test/tree.doctest +1101 -1101
  295. {nltk-3.2 → nltk-3.3}/nltk/test/treeprettyprinter.doctest +127 -127
  296. {nltk-3.2 → nltk-3.3}/nltk/test/treetransforms.doctest +156 -156
  297. nltk-3.3/nltk/test/unit/test_2x_compat.py +63 -0
  298. nltk-3.3/nltk/test/unit/test_aline.py +52 -0
  299. nltk-3.3/nltk/test/unit/test_chunk.py +56 -0
  300. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_classify.py +55 -53
  301. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_collocations.py +88 -79
  302. nltk-3.3/nltk/test/unit/test_concordance.py +98 -0
  303. nltk-3.3/nltk/test/unit/test_corenlp.py +1000 -0
  304. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_corpora.py +200 -183
  305. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_corpus_views.py +45 -45
  306. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_hmm.py +88 -88
  307. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_json2csv_corpus.py +188 -187
  308. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_naivebayes.py +26 -26
  309. nltk-3.3/nltk/test/unit/test_rte_classify.py +86 -0
  310. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_seekable_unicode_stream_reader.py +124 -124
  311. nltk-3.3/nltk/test/unit/test_senna.py +74 -0
  312. nltk-3.3/nltk/test/unit/test_stem.py +121 -0
  313. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_tag.py +20 -20
  314. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_tgrep.py +628 -626
  315. nltk-3.3/nltk/test/unit/test_tokenize.py +168 -0
  316. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_twitter_auth.py +185 -185
  317. nltk-3.3/nltk/test/unit/test_wordnet.py +134 -0
  318. nltk-3.3/nltk/test/unit/translate/test_bleu.py +244 -0
  319. nltk-3.3/nltk/test/unit/translate/test_gdfa.py +57 -0
  320. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm1.py +75 -75
  321. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm2.py +87 -87
  322. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm3.py +105 -105
  323. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm4.py +126 -126
  324. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm5.py +166 -166
  325. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm_model.py +270 -270
  326. nltk-3.3/nltk/test/unit/translate/test_nist.py +37 -0
  327. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_stack_decoder.py +300 -300
  328. {nltk-3.2 → nltk-3.3}/nltk/test/unit/utils.py +41 -41
  329. {nltk-3.2 → nltk-3.3}/nltk/test/util.doctest +48 -48
  330. {nltk-3.2 → nltk-3.3}/nltk/test/wordnet.doctest +595 -581
  331. {nltk-3.2 → nltk-3.3}/nltk/test/wordnet_fixt.py +7 -6
  332. {nltk-3.2 → nltk-3.3}/nltk/test/wordnet_lch.doctest +53 -53
  333. {nltk-3.2 → nltk-3.3}/nltk/test/wsd.doctest +68 -68
  334. {nltk-3.2 → nltk-3.3}/nltk/text.py +663 -610
  335. {nltk-3.2 → nltk-3.3}/nltk/tgrep.py +938 -937
  336. {nltk-3.2 → nltk-3.3}/nltk/tokenize/__init__.py +130 -107
  337. {nltk-3.2 → nltk-3.3}/nltk/tokenize/api.py +77 -78
  338. {nltk-3.2 → nltk-3.3}/nltk/tokenize/casual.py +343 -342
  339. {nltk-3.2 → nltk-3.3}/nltk/tokenize/mwe.py +120 -120
  340. nltk-3.3/nltk/tokenize/nist.py +173 -0
  341. {nltk-3.2 → nltk-3.3}/nltk/tokenize/punkt.py +1620 -1601
  342. {nltk-3.2 → nltk-3.3}/nltk/tokenize/regexp.py +208 -202
  343. nltk-3.3/nltk/tokenize/repp.py +151 -0
  344. {nltk-3.2 → nltk-3.3}/nltk/tokenize/sexpr.py +140 -142
  345. {nltk-3.2 → nltk-3.3}/nltk/tokenize/simple.py +138 -136
  346. {nltk-3.2 → nltk-3.3}/nltk/tokenize/stanford.py +117 -113
  347. nltk-3.3/nltk/tokenize/stanford_segmenter.py +246 -0
  348. {nltk-3.2 → nltk-3.3}/nltk/tokenize/texttiling.py +458 -460
  349. nltk-3.3/nltk/tokenize/toktok.py +155 -0
  350. nltk-3.3/nltk/tokenize/treebank.py +363 -0
  351. nltk-3.3/nltk/tokenize/util.py +261 -0
  352. {nltk-3.2 → nltk-3.3}/nltk/toolbox.py +499 -497
  353. {nltk-3.2 → nltk-3.3}/nltk/translate/__init__.py +24 -24
  354. {nltk-3.2 → nltk-3.3}/nltk/translate/api.py +331 -321
  355. {nltk-3.2 → nltk-3.3}/nltk/translate/bleu_score.py +615 -556
  356. nltk-3.3/nltk/translate/chrf_score.py +137 -0
  357. {nltk-3.2 → nltk-3.3}/nltk/translate/gale_church.py +248 -235
  358. {nltk-3.2 → nltk-3.3}/nltk/translate/gdfa.py +135 -131
  359. nltk-3.3/nltk/translate/gleu_score.py +193 -0
  360. {nltk-3.2 → nltk-3.3}/nltk/translate/ibm1.py +250 -241
  361. {nltk-3.2 → nltk-3.3}/nltk/translate/ibm2.py +308 -308
  362. {nltk-3.2 → nltk-3.3}/nltk/translate/ibm3.py +337 -337
  363. {nltk-3.2 → nltk-3.3}/nltk/translate/ibm4.py +467 -467
  364. {nltk-3.2 → nltk-3.3}/nltk/translate/ibm5.py +639 -639
  365. {nltk-3.2 → nltk-3.3}/nltk/translate/ibm_model.py +536 -533
  366. {nltk-3.2 → nltk-3.3}/nltk/translate/metrics.py +40 -40
  367. nltk-3.3/nltk/translate/nist_score.py +178 -0
  368. {nltk-3.2 → nltk-3.3}/nltk/translate/phrase_based.py +175 -175
  369. {nltk-3.2 → nltk-3.3}/nltk/translate/ribes_score.py +325 -325
  370. {nltk-3.2 → nltk-3.3}/nltk/translate/stack_decoder.py +499 -495
  371. {nltk-3.2 → nltk-3.3}/nltk/tree.py +1605 -1603
  372. {nltk-3.2 → nltk-3.3}/nltk/treeprettyprinter.py +564 -564
  373. {nltk-3.2 → nltk-3.3}/nltk/treetransforms.py +309 -309
  374. {nltk-3.2 → nltk-3.3}/nltk/twitter/__init__.py +28 -28
  375. {nltk-3.2 → nltk-3.3}/nltk/twitter/api.py +141 -136
  376. {nltk-3.2 → nltk-3.3}/nltk/twitter/common.py +264 -258
  377. {nltk-3.2 → nltk-3.3}/nltk/twitter/twitter_demo.py +288 -288
  378. {nltk-3.2 → nltk-3.3}/nltk/twitter/twitterclient.py +530 -530
  379. {nltk-3.2 → nltk-3.3}/nltk/twitter/util.py +147 -146
  380. nltk-3.3/nltk/util.py +751 -0
  381. {nltk-3.2 → nltk-3.3}/nltk/wsd.py +53 -53
  382. {nltk-3.2 → nltk-3.3/nltk.egg-info}/PKG-INFO +13 -5
  383. {nltk-3.2 → nltk-3.3}/nltk.egg-info/SOURCES.txt +26 -3
  384. nltk-3.3/nltk.egg-info/requires.txt +31 -0
  385. {nltk-3.2 → nltk-3.3}/setup.cfg +0 -1
  386. {nltk-3.2 → nltk-3.3}/setup.py +102 -75
  387. nltk-3.2/nltk/VERSION +0 -1
  388. nltk-3.2/nltk/compat.py +0 -680
  389. nltk-3.2/nltk/corpus/reader/pl196x.py +0 -278
  390. nltk-3.2/nltk/corpus/reader/verbnet.py +0 -408
  391. nltk-3.2/nltk/corpus/reader/wordlist.py +0 -37
  392. nltk-3.2/nltk/sentiment/vader_lexicon.txt +0 -7517
  393. nltk-3.2/nltk/six.py +0 -868
  394. nltk-3.2/nltk/stem/porter.py +0 -692
  395. nltk-3.2/nltk/test/unit/test_2x_compat.py +0 -26
  396. nltk-3.2/nltk/test/unit/test_stem.py +0 -36
  397. nltk-3.2/nltk/test/unit/test_tokenize.py +0 -23
  398. nltk-3.2/nltk/test/unit/translate/test_bleu.py +0 -84
  399. nltk-3.2/nltk/tokenize/treebank.py +0 -124
  400. nltk-3.2/nltk/tokenize/util.py +0 -90
  401. nltk-3.2/nltk/util.py +0 -1364
  402. {nltk-3.2 → nltk-3.3}/nltk/test/unit/__init__.py +0 -0
  403. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/__init__.py +0 -0
  404. {nltk-3.2 → nltk-3.3}/nltk.egg-info/dependency_links.txt +0 -0
  405. {nltk-3.2 → nltk-3.3}/nltk.egg-info/not-zip-safe +0 -0
  406. {nltk-3.2 → nltk-3.3}/nltk.egg-info/top_level.txt +0 -0
@@ -1,534 +1,534 @@
1
- .. Copyright (C) 2001-2015 NLTK Project
2
- .. For license information, see LICENSE.TXT
3
-
4
- ====================================
5
- Logical Inference and Model Building
6
- ====================================
7
-
8
- >>> from nltk import *
9
- >>> from nltk.sem.drt import DrtParser
10
- >>> from nltk.sem import logic
11
- >>> logic._counter._value = 0
12
-
13
- ------------
14
- Introduction
15
- ------------
16
-
17
- Within the area of automated reasoning, first order theorem proving
18
- and model building (or model generation) have both received much
19
- attention, and have given rise to highly sophisticated techniques. We
20
- focus therefore on providing an NLTK interface to third party tools
21
- for these tasks. In particular, the module ``nltk.inference`` can be
22
- used to access both theorem provers and model builders.
23
-
24
- ---------------------------------
25
- NLTK Interface to Theorem Provers
26
- ---------------------------------
27
-
28
- The main class used to interface with a theorem prover is the ``Prover``
29
- class, found in ``nltk.api``. The ``prove()`` method takes three optional
30
- arguments: a goal, a list of assumptions, and a ``verbose`` boolean to
31
- indicate whether the proof should be printed to the console. The proof goal
32
- and any assumptions need to be instances of the ``Expression`` class
33
- specified by ``nltk.sem.logic``. There are currently three theorem provers
34
- included with NLTK: ``Prover9``, ``TableauProver``, and
35
- ``ResolutionProver``. The first is an off-the-shelf prover, while the other
36
- two are written in Python and included in the ``nltk.inference`` package.
37
-
38
- >>> from nltk.sem import Expression
39
- >>> read_expr = Expression.fromstring
40
- >>> p1 = read_expr('man(socrates)')
41
- >>> p2 = read_expr('all x.(man(x) -> mortal(x))')
42
- >>> c = read_expr('mortal(socrates)')
43
- >>> Prover9().prove(c, [p1,p2])
44
- True
45
- >>> TableauProver().prove(c, [p1,p2])
46
- True
47
- >>> ResolutionProver().prove(c, [p1,p2], verbose=True)
48
- [1] {-mortal(socrates)} A
49
- [2] {man(socrates)} A
50
- [3] {-man(z2), mortal(z2)} A
51
- [4] {-man(socrates)} (1, 3)
52
- [5] {mortal(socrates)} (2, 3)
53
- [6] {} (1, 5)
54
- <BLANKLINE>
55
- True
56
-
57
- ---------------------
58
- The ``ProverCommand``
59
- ---------------------
60
-
61
- A ``ProverCommand`` is a stateful holder for a theorem
62
- prover. The command stores a theorem prover instance (of type ``Prover``),
63
- a goal, a list of assumptions, the result of the proof, and a string version
64
- of the entire proof. Corresponding to the three included ``Prover``
65
- implementations, there are three ``ProverCommand`` implementations:
66
- ``Prover9Command``, ``TableauProverCommand``, and
67
- ``ResolutionProverCommand``.
68
-
69
- The ``ProverCommand``'s constructor takes its goal and assumptions. The
70
- ``prove()`` command executes the ``Prover`` and ``proof()``
71
- returns a String form of the proof
72
- If the ``prove()`` method has not been called,
73
- then the prover command will be unable to display a proof.
74
-
75
- >>> prover = ResolutionProverCommand(c, [p1,p2])
76
- >>> print(prover.proof()) # doctest: +ELLIPSIS
77
- Traceback (most recent call last):
78
- File "...", line 1212, in __run
79
- compileflags, 1) in test.globs
80
- File "<doctest nltk/test/inference.doctest[10]>", line 1, in <module>
81
- File "...", line ..., in proof
82
- raise LookupError("You have to call prove() first to get a proof!")
83
- LookupError: You have to call prove() first to get a proof!
84
- >>> prover.prove()
85
- True
86
- >>> print(prover.proof())
87
- [1] {-mortal(socrates)} A
88
- [2] {man(socrates)} A
89
- [3] {-man(z4), mortal(z4)} A
90
- [4] {-man(socrates)} (1, 3)
91
- [5] {mortal(socrates)} (2, 3)
92
- [6] {} (1, 5)
93
- <BLANKLINE>
94
-
95
- The prover command stores the result of proving so that if ``prove()`` is
96
- called again, then the command can return the result without executing the
97
- prover again. This allows the user to access the result of the proof without
98
- wasting time re-computing what it already knows.
99
-
100
- >>> prover.prove()
101
- True
102
- >>> prover.prove()
103
- True
104
-
105
- The assumptions and goal may be accessed using the ``assumptions()`` and
106
- ``goal()`` methods, respectively.
107
-
108
- >>> prover.assumptions()
109
- [<ApplicationExpression man(socrates)>, <Alread_expression all x.(man(x) -> mortal(x))>]
110
- >>> prover.goal()
111
- <ApplicationExpression mortal(socrates)>
112
-
113
- The assumptions list may be modified using the ``add_assumptions()`` and
114
- ``retract_assumptions()`` methods. Both methods take a list of ``Expression``
115
- objects. Since adding or removing assumptions may change the result of the
116
- proof, the stored result is cleared when either of these methods are called.
117
- That means that ``proof()`` will be unavailable until ``prove()`` is called and
118
- a call to ``prove()`` will execute the theorem prover.
119
-
120
- >>> prover.retract_assumptions([read_expr('man(socrates)')])
121
- >>> print(prover.proof()) # doctest: +ELLIPSIS
122
- Traceback (most recent call last):
123
- File "...", line 1212, in __run
124
- compileflags, 1) in test.globs
125
- File "<doctest nltk/test/inference.doctest[10]>", line 1, in <module>
126
- File "...", line ..., in proof
127
- raise LookupError("You have to call prove() first to get a proof!")
128
- LookupError: You have to call prove() first to get a proof!
129
- >>> prover.prove()
130
- False
131
- >>> print(prover.proof())
132
- [1] {-mortal(socrates)} A
133
- [2] {-man(z6), mortal(z6)} A
134
- [3] {-man(socrates)} (1, 2)
135
- <BLANKLINE>
136
- >>> prover.add_assumptions([read_expr('man(socrates)')])
137
- >>> prover.prove()
138
- True
139
-
140
- -------
141
- Prover9
142
- -------
143
-
144
- Prover9 Installation
145
- ~~~~~~~~~~~~~~~~~~~~
146
-
147
- You can download Prover9 from http://www.cs.unm.edu/~mccune/prover9/.
148
-
149
- Extract the source code into a suitable directory and follow the
150
- instructions in the Prover9 ``README.make`` file to compile the executables.
151
- Install these into an appropriate location; the
152
- ``prover9_search`` variable is currently configured to look in the
153
- following locations:
154
-
155
- >>> p = Prover9()
156
- >>> p.binary_locations() # doctest: +NORMALIZE_WHITESPACE
157
- ['/usr/local/bin/prover9',
158
- '/usr/local/bin/prover9/bin',
159
- '/usr/local/bin',
160
- '/usr/bin',
161
- '/usr/local/prover9',
162
- '/usr/local/share/prover9']
163
-
164
- Alternatively, the environment variable ``PROVER9HOME`` may be configured with
165
- the binary's location.
166
-
167
- The path to the correct directory can be set manually in the following
168
- manner:
169
-
170
- >>> config_prover9(path='/usr/local/bin') # doctest: +SKIP
171
- [Found prover9: /usr/local/bin/prover9]
172
-
173
- If the executables cannot be found, ``Prover9`` will issue a warning message:
174
-
175
- >>> p.prove() # doctest: +SKIP
176
- Traceback (most recent call last):
177
- ...
178
- LookupError:
179
- ===========================================================================
180
- NLTK was unable to find the prover9 executable! Use config_prover9() or
181
- set the PROVER9HOME environment variable.
182
- <BLANKLINE>
183
- >> config_prover9('/path/to/prover9')
184
- <BLANKLINE>
185
- For more information, on prover9, see:
186
- <http://www.cs.unm.edu/~mccune/prover9/>
187
- ===========================================================================
188
-
189
-
190
- Using Prover9
191
- ~~~~~~~~~~~~~
192
-
193
- The general case in theorem proving is to determine whether ``S |- g``
194
- holds, where ``S`` is a possibly empty set of assumptions, and ``g``
195
- is a proof goal.
196
-
197
- As mentioned earlier, NLTK input to ``Prover9`` must be
198
- ``Expression``\ s of ``nltk.sem.logic``. A ``Prover9`` instance is
199
- initialized with a proof goal and, possibly, some assumptions. The
200
- ``prove()`` method attempts to find a proof of the goal, given the
201
- list of assumptions (in this case, none).
202
-
203
- >>> goal = read_expr('(man(x) <-> --man(x))')
204
- >>> prover = Prover9Command(goal)
205
- >>> prover.prove()
206
- True
207
-
208
- Given a ``ProverCommand`` instance ``prover``, the method
209
- ``prover.proof()`` will return a String of the extensive proof information
210
- provided by Prover9, shown in abbreviated form here::
211
-
212
- ============================== Prover9 ===============================
213
- Prover9 (32) version ...
214
- Process ... was started by ... on ...
215
- ...
216
- The command was ".../prover9 -f ...".
217
- ============================== end of head ===========================
218
-
219
- ============================== INPUT =================================
220
-
221
- % Reading from file /var/...
222
-
223
-
224
- formulas(goals).
225
- (all x (man(x) -> man(x))).
226
- end_of_list.
227
-
228
- ...
229
- ============================== end of search =========================
230
-
231
- THEOREM PROVED
232
-
233
- Exiting with 1 proof.
234
-
235
- Process 6317 exit (max_proofs) Mon Jan 21 15:23:28 2008
236
-
237
-
238
- As mentioned earlier, we may want to list some assumptions for
239
- the proof, as shown here.
240
-
241
- >>> g = read_expr('mortal(socrates)')
242
- >>> a1 = read_expr('all x.(man(x) -> mortal(x))')
243
- >>> prover = Prover9Command(g, assumptions=[a1])
244
- >>> prover.print_assumptions()
245
- all x.(man(x) -> mortal(x))
246
-
247
- However, the assumptions are not sufficient to derive the goal:
248
-
249
- >>> print(prover.prove())
250
- False
251
-
252
- So let's add another assumption:
253
-
254
- >>> a2 = read_expr('man(socrates)')
255
- >>> prover.add_assumptions([a2])
256
- >>> prover.print_assumptions()
257
- all x.(man(x) -> mortal(x))
258
- man(socrates)
259
- >>> print(prover.prove())
260
- True
261
-
262
- We can also show the assumptions in ``Prover9`` format.
263
-
264
- >>> prover.print_assumptions(output_format='Prover9')
265
- all x (man(x) -> mortal(x))
266
- man(socrates)
267
-
268
- >>> prover.print_assumptions(output_format='Spass')
269
- Traceback (most recent call last):
270
- . . .
271
- NameError: Unrecognized value for 'output_format': Spass
272
-
273
- Assumptions can be retracted from the list of assumptions.
274
-
275
- >>> prover.retract_assumptions([a1])
276
- >>> prover.print_assumptions()
277
- man(socrates)
278
- >>> prover.retract_assumptions([a1])
279
-
280
- Statements can be loaded from a file and parsed. We can then add these
281
- statements as new assumptions.
282
-
283
- >>> g = read_expr('all x.(boxer(x) -> -boxerdog(x))')
284
- >>> prover = Prover9Command(g)
285
- >>> prover.prove()
286
- False
287
- >>> import nltk.data
288
- >>> new = nltk.data.load('grammars/sample_grammars/background0.fol')
289
- >>> for a in new:
290
- ... print(a)
291
- all x.(boxerdog(x) -> dog(x))
292
- all x.(boxer(x) -> person(x))
293
- all x.-(dog(x) & person(x))
294
- exists x.boxer(x)
295
- exists x.boxerdog(x)
296
- >>> prover.add_assumptions(new)
297
- >>> print(prover.prove())
298
- True
299
- >>> print(prover.proof()) # doctest: +ELLIPSIS
300
- ============================== prooftrans ============================
301
- Prover9 (...) version ...
302
- Process ... was started by ... on ...
303
- ...
304
- The command was ".../prover9".
305
- ============================== end of head ===========================
306
- <BLANKLINE>
307
- ============================== end of input ==========================
308
- <BLANKLINE>
309
- ============================== PROOF =================================
310
- <BLANKLINE>
311
- % -------- Comments from original proof --------
312
- % Proof 1 at ... seconds.
313
- % Length of proof is 13.
314
- % Level of proof is 4.
315
- % Maximum clause weight is 0.000.
316
- % Given clauses 0.
317
- <BLANKLINE>
318
- <BLANKLINE>
319
- 1 (all x (boxerdog(x) -> dog(x))). [assumption].
320
- 2 (all x (boxer(x) -> person(x))). [assumption].
321
- 3 (all x -(dog(x) & person(x))). [assumption].
322
- 6 (all x (boxer(x) -> -boxerdog(x))). [goal].
323
- 8 -boxerdog(x) | dog(x). [clausify(1)].
324
- 9 boxerdog(c3). [deny(6)].
325
- 11 -boxer(x) | person(x). [clausify(2)].
326
- 12 boxer(c3). [deny(6)].
327
- 14 -dog(x) | -person(x). [clausify(3)].
328
- 15 dog(c3). [resolve(9,a,8,a)].
329
- 18 person(c3). [resolve(12,a,11,a)].
330
- 19 -person(c3). [resolve(15,a,14,a)].
331
- 20 $F. [resolve(19,a,18,a)].
332
- <BLANKLINE>
333
- ============================== end of proof ==========================
334
-
335
- ----------------------
336
- The equiv() method
337
- ----------------------
338
-
339
- One application of the theorem prover functionality is to check if
340
- two Expressions have the same meaning.
341
- The ``equiv()`` method calls a theorem prover to determine whether two
342
- Expressions are logically equivalent.
343
-
344
- >>> a = read_expr(r'exists x.(man(x) & walks(x))')
345
- >>> b = read_expr(r'exists x.(walks(x) & man(x))')
346
- >>> print(a.equiv(b))
347
- True
348
-
349
- The same method can be used on Discourse Representation Structures (DRSs).
350
- In this case, each DRS is converted to a first order logic form, and then
351
- passed to the theorem prover.
352
-
353
- >>> dp = DrtParser()
354
- >>> a = dp.parse(r'([x],[man(x), walks(x)])')
355
- >>> b = dp.parse(r'([x],[walks(x), man(x)])')
356
- >>> print(a.equiv(b))
357
- True
358
-
359
-
360
- --------------------------------
361
- NLTK Interface to Model Builders
362
- --------------------------------
363
-
364
- The top-level to model builders is parallel to that for
365
- theorem-provers. The ``ModelBuilder`` interface is located
366
- in ``nltk.inference.api``. It is currently only implemented by
367
- ``Mace``, which interfaces with the Mace4 model builder.
368
-
369
- Typically we use a model builder to show that some set of formulas has
370
- a model, and is therefore consistent. One way of doing this is by
371
- treating our candidate set of sentences as assumptions, and leaving
372
- the goal unspecified.
373
- Thus, the following interaction shows how both ``{a, c1}`` and ``{a, c2}``
374
- are consistent sets, since Mace succeeds in a building a
375
- model for each of them, while ``{c1, c2}`` is inconsistent.
376
-
377
- >>> a3 = read_expr('exists x.(man(x) and walks(x))')
378
- >>> c1 = read_expr('mortal(socrates)')
379
- >>> c2 = read_expr('-mortal(socrates)')
380
- >>> mace = Mace()
381
- >>> print(mace.build_model(None, [a3, c1]))
382
- True
383
- >>> print(mace.build_model(None, [a3, c2]))
384
- True
385
-
386
- We can also use the model builder as an adjunct to theorem prover.
387
- Let's suppose we are trying to prove ``S |- g``, i.e. that ``g``
388
- is logically entailed by assumptions ``S = {s1, s2, ..., sn}``.
389
- We can this same input to Mace4, and the model builder will try to
390
- find a counterexample, that is, to show that ``g`` does *not* follow
391
- from ``S``. So, given this input, Mace4 will try to find a model for
392
- the set ``S' = {s1, s2, ..., sn, (not g)}``. If ``g`` fails to follow
393
- from ``S``, then Mace4 may well return with a counterexample faster
394
- than Prover9 concludes that it cannot find the required proof.
395
- Conversely, if ``g`` *is* provable from ``S``, Mace4 may take a long
396
- time unsuccessfully trying to find a counter model, and will eventually give up.
397
-
398
- In the following example, we see that the model builder does succeed
399
- in building a model of the assumptions together with the negation of
400
- the goal. That is, it succeeds in finding a model
401
- where there is a woman that every man loves; Adam is a man; Eve is a
402
- woman; but Adam does not love Eve.
403
-
404
- >>> a4 = read_expr('exists y. (woman(y) & all x. (man(x) -> love(x,y)))')
405
- >>> a5 = read_expr('man(adam)')
406
- >>> a6 = read_expr('woman(eve)')
407
- >>> g = read_expr('love(adam,eve)')
408
- >>> print(mace.build_model(g, [a4, a5, a6]))
409
- True
410
-
411
- The Model Builder will fail to find a model if the assumptions do entail
412
- the goal. Mace will continue to look for models of ever-increasing sizes
413
- until the end_size number is reached. By default, end_size is 500,
414
- but it can be set manually for quicker response time.
415
-
416
- >>> a7 = read_expr('all x.(man(x) -> mortal(x))')
417
- >>> a8 = read_expr('man(socrates)')
418
- >>> g2 = read_expr('mortal(socrates)')
419
- >>> print(Mace(end_size=50).build_model(g2, [a7, a8]))
420
- False
421
-
422
- There is also a ``ModelBuilderCommand`` class that, like ``ProverCommand``,
423
- stores a ``ModelBuilder``, a goal, assumptions, a result, and a model. The
424
- only implementation in NLTK is ``MaceCommand``.
425
-
426
-
427
- -----
428
- Mace4
429
- -----
430
-
431
- Mace4 Installation
432
- ~~~~~~~~~~~~~~~~~~
433
-
434
- Mace4 is packaged with Prover9, and can be downloaded from the same
435
- source, namely http://www.cs.unm.edu/~mccune/prover9/. It is installed
436
- in the same manner as Prover9.
437
-
438
- Using Mace4
439
- ~~~~~~~~~~~
440
-
441
- Check whether Mace4 can find a model.
442
-
443
- >>> a = read_expr('(see(mary,john) & -(mary = john))')
444
- >>> mb = MaceCommand(assumptions=[a])
445
- >>> mb.build_model()
446
- True
447
-
448
- Show the model in 'tabular' format.
449
-
450
- >>> print(mb.model(format='tabular'))
451
- % number = 1
452
- % seconds = 0
453
- <BLANKLINE>
454
- % Interpretation of size 2
455
- <BLANKLINE>
456
- john : 0
457
- <BLANKLINE>
458
- mary : 1
459
- <BLANKLINE>
460
- see :
461
- | 0 1
462
- ---+----
463
- 0 | 0 0
464
- 1 | 1 0
465
- <BLANKLINE>
466
-
467
- Show the model in 'tabular' format.
468
-
469
- >>> print(mb.model(format='cooked'))
470
- % number = 1
471
- % seconds = 0
472
- <BLANKLINE>
473
- % Interpretation of size 2
474
- <BLANKLINE>
475
- john = 0.
476
- <BLANKLINE>
477
- mary = 1.
478
- <BLANKLINE>
479
- - see(0,0).
480
- - see(0,1).
481
- see(1,0).
482
- - see(1,1).
483
- <BLANKLINE>
484
-
485
- The property ``valuation`` accesses the stored ``Valuation``.
486
-
487
- >>> print(mb.valuation)
488
- {'john': 'a', 'mary': 'b', 'see': {('b', 'a')}}
489
-
490
- We can return to our earlier example and inspect the model:
491
-
492
- >>> mb = MaceCommand(g, assumptions=[a4, a5, a6])
493
- >>> m = mb.build_model()
494
- >>> print(mb.model(format='cooked'))
495
- % number = 1
496
- % seconds = 0
497
- <BLANKLINE>
498
- % Interpretation of size 2
499
- <BLANKLINE>
500
- adam = 0.
501
- <BLANKLINE>
502
- eve = 0.
503
- <BLANKLINE>
504
- c1 = 1.
505
- <BLANKLINE>
506
- man(0).
507
- - man(1).
508
- <BLANKLINE>
509
- woman(0).
510
- woman(1).
511
- <BLANKLINE>
512
- - love(0,0).
513
- love(0,1).
514
- - love(1,0).
515
- - love(1,1).
516
- <BLANKLINE>
517
-
518
- Here, we can see that ``adam`` and ``eve`` have been assigned the same
519
- individual, namely ``0`` as value; ``0`` is both a man and a woman; a second
520
- individual ``1`` is also a woman; and ``0`` loves ``1``. Thus, this is
521
- an interpretation in which there is a woman that every man loves but
522
- Adam doesn't love Eve.
523
-
524
- Mace can also be used with propositional logic.
525
-
526
- >>> p = read_expr('P')
527
- >>> q = read_expr('Q')
528
- >>> mb = MaceCommand(q, [p, p>-q])
529
- >>> mb.build_model()
530
- True
531
- >>> mb.valuation['P']
532
- True
533
- >>> mb.valuation['Q']
534
- False
1
+ .. Copyright (C) 2001-2018 NLTK Project
2
+ .. For license information, see LICENSE.TXT
3
+
4
+ ====================================
5
+ Logical Inference and Model Building
6
+ ====================================
7
+
8
+ >>> from nltk import *
9
+ >>> from nltk.sem.drt import DrtParser
10
+ >>> from nltk.sem import logic
11
+ >>> logic._counter._value = 0
12
+
13
+ ------------
14
+ Introduction
15
+ ------------
16
+
17
+ Within the area of automated reasoning, first order theorem proving
18
+ and model building (or model generation) have both received much
19
+ attention, and have given rise to highly sophisticated techniques. We
20
+ focus therefore on providing an NLTK interface to third party tools
21
+ for these tasks. In particular, the module ``nltk.inference`` can be
22
+ used to access both theorem provers and model builders.
23
+
24
+ ---------------------------------
25
+ NLTK Interface to Theorem Provers
26
+ ---------------------------------
27
+
28
+ The main class used to interface with a theorem prover is the ``Prover``
29
+ class, found in ``nltk.api``. The ``prove()`` method takes three optional
30
+ arguments: a goal, a list of assumptions, and a ``verbose`` boolean to
31
+ indicate whether the proof should be printed to the console. The proof goal
32
+ and any assumptions need to be instances of the ``Expression`` class
33
+ specified by ``nltk.sem.logic``. There are currently three theorem provers
34
+ included with NLTK: ``Prover9``, ``TableauProver``, and
35
+ ``ResolutionProver``. The first is an off-the-shelf prover, while the other
36
+ two are written in Python and included in the ``nltk.inference`` package.
37
+
38
+ >>> from nltk.sem import Expression
39
+ >>> read_expr = Expression.fromstring
40
+ >>> p1 = read_expr('man(socrates)')
41
+ >>> p2 = read_expr('all x.(man(x) -> mortal(x))')
42
+ >>> c = read_expr('mortal(socrates)')
43
+ >>> Prover9().prove(c, [p1,p2])
44
+ True
45
+ >>> TableauProver().prove(c, [p1,p2])
46
+ True
47
+ >>> ResolutionProver().prove(c, [p1,p2], verbose=True)
48
+ [1] {-mortal(socrates)} A
49
+ [2] {man(socrates)} A
50
+ [3] {-man(z2), mortal(z2)} A
51
+ [4] {-man(socrates)} (1, 3)
52
+ [5] {mortal(socrates)} (2, 3)
53
+ [6] {} (1, 5)
54
+ <BLANKLINE>
55
+ True
56
+
57
+ ---------------------
58
+ The ``ProverCommand``
59
+ ---------------------
60
+
61
+ A ``ProverCommand`` is a stateful holder for a theorem
62
+ prover. The command stores a theorem prover instance (of type ``Prover``),
63
+ a goal, a list of assumptions, the result of the proof, and a string version
64
+ of the entire proof. Corresponding to the three included ``Prover``
65
+ implementations, there are three ``ProverCommand`` implementations:
66
+ ``Prover9Command``, ``TableauProverCommand``, and
67
+ ``ResolutionProverCommand``.
68
+
69
+ The ``ProverCommand``'s constructor takes its goal and assumptions. The
70
+ ``prove()`` command executes the ``Prover`` and ``proof()``
71
+ returns a String form of the proof
72
+ If the ``prove()`` method has not been called,
73
+ then the prover command will be unable to display a proof.
74
+
75
+ >>> prover = ResolutionProverCommand(c, [p1,p2])
76
+ >>> print(prover.proof()) # doctest: +ELLIPSIS
77
+ Traceback (most recent call last):
78
+ File "...", line 1212, in __run
79
+ compileflags, 1) in test.globs
80
+ File "<doctest nltk/test/inference.doctest[10]>", line 1, in <module>
81
+ File "...", line ..., in proof
82
+ raise LookupError("You have to call prove() first to get a proof!")
83
+ LookupError: You have to call prove() first to get a proof!
84
+ >>> prover.prove()
85
+ True
86
+ >>> print(prover.proof())
87
+ [1] {-mortal(socrates)} A
88
+ [2] {man(socrates)} A
89
+ [3] {-man(z4), mortal(z4)} A
90
+ [4] {-man(socrates)} (1, 3)
91
+ [5] {mortal(socrates)} (2, 3)
92
+ [6] {} (1, 5)
93
+ <BLANKLINE>
94
+
95
+ The prover command stores the result of proving so that if ``prove()`` is
96
+ called again, then the command can return the result without executing the
97
+ prover again. This allows the user to access the result of the proof without
98
+ wasting time re-computing what it already knows.
99
+
100
+ >>> prover.prove()
101
+ True
102
+ >>> prover.prove()
103
+ True
104
+
105
+ The assumptions and goal may be accessed using the ``assumptions()`` and
106
+ ``goal()`` methods, respectively.
107
+
108
+ >>> prover.assumptions()
109
+ [<ApplicationExpression man(socrates)>, <Alread_expression all x.(man(x) -> mortal(x))>]
110
+ >>> prover.goal()
111
+ <ApplicationExpression mortal(socrates)>
112
+
113
+ The assumptions list may be modified using the ``add_assumptions()`` and
114
+ ``retract_assumptions()`` methods. Both methods take a list of ``Expression``
115
+ objects. Since adding or removing assumptions may change the result of the
116
+ proof, the stored result is cleared when either of these methods are called.
117
+ That means that ``proof()`` will be unavailable until ``prove()`` is called and
118
+ a call to ``prove()`` will execute the theorem prover.
119
+
120
+ >>> prover.retract_assumptions([read_expr('man(socrates)')])
121
+ >>> print(prover.proof()) # doctest: +ELLIPSIS
122
+ Traceback (most recent call last):
123
+ File "...", line 1212, in __run
124
+ compileflags, 1) in test.globs
125
+ File "<doctest nltk/test/inference.doctest[10]>", line 1, in <module>
126
+ File "...", line ..., in proof
127
+ raise LookupError("You have to call prove() first to get a proof!")
128
+ LookupError: You have to call prove() first to get a proof!
129
+ >>> prover.prove()
130
+ False
131
+ >>> print(prover.proof())
132
+ [1] {-mortal(socrates)} A
133
+ [2] {-man(z6), mortal(z6)} A
134
+ [3] {-man(socrates)} (1, 2)
135
+ <BLANKLINE>
136
+ >>> prover.add_assumptions([read_expr('man(socrates)')])
137
+ >>> prover.prove()
138
+ True
139
+
140
+ -------
141
+ Prover9
142
+ -------
143
+
144
+ Prover9 Installation
145
+ ~~~~~~~~~~~~~~~~~~~~
146
+
147
+ You can download Prover9 from http://www.cs.unm.edu/~mccune/prover9/.
148
+
149
+ Extract the source code into a suitable directory and follow the
150
+ instructions in the Prover9 ``README.make`` file to compile the executables.
151
+ Install these into an appropriate location; the
152
+ ``prover9_search`` variable is currently configured to look in the
153
+ following locations:
154
+
155
+ >>> p = Prover9()
156
+ >>> p.binary_locations() # doctest: +NORMALIZE_WHITESPACE
157
+ ['/usr/local/bin/prover9',
158
+ '/usr/local/bin/prover9/bin',
159
+ '/usr/local/bin',
160
+ '/usr/bin',
161
+ '/usr/local/prover9',
162
+ '/usr/local/share/prover9']
163
+
164
+ Alternatively, the environment variable ``PROVER9HOME`` may be configured with
165
+ the binary's location.
166
+
167
+ The path to the correct directory can be set manually in the following
168
+ manner:
169
+
170
+ >>> config_prover9(path='/usr/local/bin') # doctest: +SKIP
171
+ [Found prover9: /usr/local/bin/prover9]
172
+
173
+ If the executables cannot be found, ``Prover9`` will issue a warning message:
174
+
175
+ >>> p.prove() # doctest: +SKIP
176
+ Traceback (most recent call last):
177
+ ...
178
+ LookupError:
179
+ ===========================================================================
180
+ NLTK was unable to find the prover9 executable! Use config_prover9() or
181
+ set the PROVER9HOME environment variable.
182
+ <BLANKLINE>
183
+ >> config_prover9('/path/to/prover9')
184
+ <BLANKLINE>
185
+ For more information, on prover9, see:
186
+ <http://www.cs.unm.edu/~mccune/prover9/>
187
+ ===========================================================================
188
+
189
+
190
+ Using Prover9
191
+ ~~~~~~~~~~~~~
192
+
193
+ The general case in theorem proving is to determine whether ``S |- g``
194
+ holds, where ``S`` is a possibly empty set of assumptions, and ``g``
195
+ is a proof goal.
196
+
197
+ As mentioned earlier, NLTK input to ``Prover9`` must be
198
+ ``Expression``\ s of ``nltk.sem.logic``. A ``Prover9`` instance is
199
+ initialized with a proof goal and, possibly, some assumptions. The
200
+ ``prove()`` method attempts to find a proof of the goal, given the
201
+ list of assumptions (in this case, none).
202
+
203
+ >>> goal = read_expr('(man(x) <-> --man(x))')
204
+ >>> prover = Prover9Command(goal)
205
+ >>> prover.prove()
206
+ True
207
+
208
+ Given a ``ProverCommand`` instance ``prover``, the method
209
+ ``prover.proof()`` will return a String of the extensive proof information
210
+ provided by Prover9, shown in abbreviated form here::
211
+
212
+ ============================== Prover9 ===============================
213
+ Prover9 (32) version ...
214
+ Process ... was started by ... on ...
215
+ ...
216
+ The command was ".../prover9 -f ...".
217
+ ============================== end of head ===========================
218
+
219
+ ============================== INPUT =================================
220
+
221
+ % Reading from file /var/...
222
+
223
+
224
+ formulas(goals).
225
+ (all x (man(x) -> man(x))).
226
+ end_of_list.
227
+
228
+ ...
229
+ ============================== end of search =========================
230
+
231
+ THEOREM PROVED
232
+
233
+ Exiting with 1 proof.
234
+
235
+ Process 6317 exit (max_proofs) Mon Jan 21 15:23:28 2008
236
+
237
+
238
+ As mentioned earlier, we may want to list some assumptions for
239
+ the proof, as shown here.
240
+
241
+ >>> g = read_expr('mortal(socrates)')
242
+ >>> a1 = read_expr('all x.(man(x) -> mortal(x))')
243
+ >>> prover = Prover9Command(g, assumptions=[a1])
244
+ >>> prover.print_assumptions()
245
+ all x.(man(x) -> mortal(x))
246
+
247
+ However, the assumptions are not sufficient to derive the goal:
248
+
249
+ >>> print(prover.prove())
250
+ False
251
+
252
+ So let's add another assumption:
253
+
254
+ >>> a2 = read_expr('man(socrates)')
255
+ >>> prover.add_assumptions([a2])
256
+ >>> prover.print_assumptions()
257
+ all x.(man(x) -> mortal(x))
258
+ man(socrates)
259
+ >>> print(prover.prove())
260
+ True
261
+
262
+ We can also show the assumptions in ``Prover9`` format.
263
+
264
+ >>> prover.print_assumptions(output_format='Prover9')
265
+ all x (man(x) -> mortal(x))
266
+ man(socrates)
267
+
268
+ >>> prover.print_assumptions(output_format='Spass')
269
+ Traceback (most recent call last):
270
+ . . .
271
+ NameError: Unrecognized value for 'output_format': Spass
272
+
273
+ Assumptions can be retracted from the list of assumptions.
274
+
275
+ >>> prover.retract_assumptions([a1])
276
+ >>> prover.print_assumptions()
277
+ man(socrates)
278
+ >>> prover.retract_assumptions([a1])
279
+
280
+ Statements can be loaded from a file and parsed. We can then add these
281
+ statements as new assumptions.
282
+
283
+ >>> g = read_expr('all x.(boxer(x) -> -boxerdog(x))')
284
+ >>> prover = Prover9Command(g)
285
+ >>> prover.prove()
286
+ False
287
+ >>> import nltk.data
288
+ >>> new = nltk.data.load('grammars/sample_grammars/background0.fol')
289
+ >>> for a in new:
290
+ ... print(a)
291
+ all x.(boxerdog(x) -> dog(x))
292
+ all x.(boxer(x) -> person(x))
293
+ all x.-(dog(x) & person(x))
294
+ exists x.boxer(x)
295
+ exists x.boxerdog(x)
296
+ >>> prover.add_assumptions(new)
297
+ >>> print(prover.prove())
298
+ True
299
+ >>> print(prover.proof()) # doctest: +ELLIPSIS
300
+ ============================== prooftrans ============================
301
+ Prover9 (...) version ...
302
+ Process ... was started by ... on ...
303
+ ...
304
+ The command was ".../prover9".
305
+ ============================== end of head ===========================
306
+ <BLANKLINE>
307
+ ============================== end of input ==========================
308
+ <BLANKLINE>
309
+ ============================== PROOF =================================
310
+ <BLANKLINE>
311
+ % -------- Comments from original proof --------
312
+ % Proof 1 at ... seconds.
313
+ % Length of proof is 13.
314
+ % Level of proof is 4.
315
+ % Maximum clause weight is 0.000.
316
+ % Given clauses 0.
317
+ <BLANKLINE>
318
+ <BLANKLINE>
319
+ 1 (all x (boxerdog(x) -> dog(x))). [assumption].
320
+ 2 (all x (boxer(x) -> person(x))). [assumption].
321
+ 3 (all x -(dog(x) & person(x))). [assumption].
322
+ 6 (all x (boxer(x) -> -boxerdog(x))). [goal].
323
+ 8 -boxerdog(x) | dog(x). [clausify(1)].
324
+ 9 boxerdog(c3). [deny(6)].
325
+ 11 -boxer(x) | person(x). [clausify(2)].
326
+ 12 boxer(c3). [deny(6)].
327
+ 14 -dog(x) | -person(x). [clausify(3)].
328
+ 15 dog(c3). [resolve(9,a,8,a)].
329
+ 18 person(c3). [resolve(12,a,11,a)].
330
+ 19 -person(c3). [resolve(15,a,14,a)].
331
+ 20 $F. [resolve(19,a,18,a)].
332
+ <BLANKLINE>
333
+ ============================== end of proof ==========================
334
+
335
+ ----------------------
336
+ The equiv() method
337
+ ----------------------
338
+
339
+ One application of the theorem prover functionality is to check if
340
+ two Expressions have the same meaning.
341
+ The ``equiv()`` method calls a theorem prover to determine whether two
342
+ Expressions are logically equivalent.
343
+
344
+ >>> a = read_expr(r'exists x.(man(x) & walks(x))')
345
+ >>> b = read_expr(r'exists x.(walks(x) & man(x))')
346
+ >>> print(a.equiv(b))
347
+ True
348
+
349
+ The same method can be used on Discourse Representation Structures (DRSs).
350
+ In this case, each DRS is converted to a first order logic form, and then
351
+ passed to the theorem prover.
352
+
353
+ >>> dp = DrtParser()
354
+ >>> a = dp.parse(r'([x],[man(x), walks(x)])')
355
+ >>> b = dp.parse(r'([x],[walks(x), man(x)])')
356
+ >>> print(a.equiv(b))
357
+ True
358
+
359
+
360
+ --------------------------------
361
+ NLTK Interface to Model Builders
362
+ --------------------------------
363
+
364
+ The top-level to model builders is parallel to that for
365
+ theorem-provers. The ``ModelBuilder`` interface is located
366
+ in ``nltk.inference.api``. It is currently only implemented by
367
+ ``Mace``, which interfaces with the Mace4 model builder.
368
+
369
+ Typically we use a model builder to show that some set of formulas has
370
+ a model, and is therefore consistent. One way of doing this is by
371
+ treating our candidate set of sentences as assumptions, and leaving
372
+ the goal unspecified.
373
+ Thus, the following interaction shows how both ``{a, c1}`` and ``{a, c2}``
374
+ are consistent sets, since Mace succeeds in a building a
375
+ model for each of them, while ``{c1, c2}`` is inconsistent.
376
+
377
+ >>> a3 = read_expr('exists x.(man(x) and walks(x))')
378
+ >>> c1 = read_expr('mortal(socrates)')
379
+ >>> c2 = read_expr('-mortal(socrates)')
380
+ >>> mace = Mace()
381
+ >>> print(mace.build_model(None, [a3, c1]))
382
+ True
383
+ >>> print(mace.build_model(None, [a3, c2]))
384
+ True
385
+
386
+ We can also use the model builder as an adjunct to theorem prover.
387
+ Let's suppose we are trying to prove ``S |- g``, i.e. that ``g``
388
+ is logically entailed by assumptions ``S = {s1, s2, ..., sn}``.
389
+ We can this same input to Mace4, and the model builder will try to
390
+ find a counterexample, that is, to show that ``g`` does *not* follow
391
+ from ``S``. So, given this input, Mace4 will try to find a model for
392
+ the set ``S' = {s1, s2, ..., sn, (not g)}``. If ``g`` fails to follow
393
+ from ``S``, then Mace4 may well return with a counterexample faster
394
+ than Prover9 concludes that it cannot find the required proof.
395
+ Conversely, if ``g`` *is* provable from ``S``, Mace4 may take a long
396
+ time unsuccessfully trying to find a counter model, and will eventually give up.
397
+
398
+ In the following example, we see that the model builder does succeed
399
+ in building a model of the assumptions together with the negation of
400
+ the goal. That is, it succeeds in finding a model
401
+ where there is a woman that every man loves; Adam is a man; Eve is a
402
+ woman; but Adam does not love Eve.
403
+
404
+ >>> a4 = read_expr('exists y. (woman(y) & all x. (man(x) -> love(x,y)))')
405
+ >>> a5 = read_expr('man(adam)')
406
+ >>> a6 = read_expr('woman(eve)')
407
+ >>> g = read_expr('love(adam,eve)')
408
+ >>> print(mace.build_model(g, [a4, a5, a6]))
409
+ True
410
+
411
+ The Model Builder will fail to find a model if the assumptions do entail
412
+ the goal. Mace will continue to look for models of ever-increasing sizes
413
+ until the end_size number is reached. By default, end_size is 500,
414
+ but it can be set manually for quicker response time.
415
+
416
+ >>> a7 = read_expr('all x.(man(x) -> mortal(x))')
417
+ >>> a8 = read_expr('man(socrates)')
418
+ >>> g2 = read_expr('mortal(socrates)')
419
+ >>> print(Mace(end_size=50).build_model(g2, [a7, a8]))
420
+ False
421
+
422
+ There is also a ``ModelBuilderCommand`` class that, like ``ProverCommand``,
423
+ stores a ``ModelBuilder``, a goal, assumptions, a result, and a model. The
424
+ only implementation in NLTK is ``MaceCommand``.
425
+
426
+
427
+ -----
428
+ Mace4
429
+ -----
430
+
431
+ Mace4 Installation
432
+ ~~~~~~~~~~~~~~~~~~
433
+
434
+ Mace4 is packaged with Prover9, and can be downloaded from the same
435
+ source, namely http://www.cs.unm.edu/~mccune/prover9/. It is installed
436
+ in the same manner as Prover9.
437
+
438
+ Using Mace4
439
+ ~~~~~~~~~~~
440
+
441
+ Check whether Mace4 can find a model.
442
+
443
+ >>> a = read_expr('(see(mary,john) & -(mary = john))')
444
+ >>> mb = MaceCommand(assumptions=[a])
445
+ >>> mb.build_model()
446
+ True
447
+
448
+ Show the model in 'tabular' format.
449
+
450
+ >>> print(mb.model(format='tabular'))
451
+ % number = 1
452
+ % seconds = 0
453
+ <BLANKLINE>
454
+ % Interpretation of size 2
455
+ <BLANKLINE>
456
+ john : 0
457
+ <BLANKLINE>
458
+ mary : 1
459
+ <BLANKLINE>
460
+ see :
461
+ | 0 1
462
+ ---+----
463
+ 0 | 0 0
464
+ 1 | 1 0
465
+ <BLANKLINE>
466
+
467
+ Show the model in 'tabular' format.
468
+
469
+ >>> print(mb.model(format='cooked'))
470
+ % number = 1
471
+ % seconds = 0
472
+ <BLANKLINE>
473
+ % Interpretation of size 2
474
+ <BLANKLINE>
475
+ john = 0.
476
+ <BLANKLINE>
477
+ mary = 1.
478
+ <BLANKLINE>
479
+ - see(0,0).
480
+ - see(0,1).
481
+ see(1,0).
482
+ - see(1,1).
483
+ <BLANKLINE>
484
+
485
+ The property ``valuation`` accesses the stored ``Valuation``.
486
+
487
+ >>> print(mb.valuation)
488
+ {'john': 'a', 'mary': 'b', 'see': {('b', 'a')}}
489
+
490
+ We can return to our earlier example and inspect the model:
491
+
492
+ >>> mb = MaceCommand(g, assumptions=[a4, a5, a6])
493
+ >>> m = mb.build_model()
494
+ >>> print(mb.model(format='cooked'))
495
+ % number = 1
496
+ % seconds = 0
497
+ <BLANKLINE>
498
+ % Interpretation of size 2
499
+ <BLANKLINE>
500
+ adam = 0.
501
+ <BLANKLINE>
502
+ eve = 0.
503
+ <BLANKLINE>
504
+ c1 = 1.
505
+ <BLANKLINE>
506
+ man(0).
507
+ - man(1).
508
+ <BLANKLINE>
509
+ woman(0).
510
+ woman(1).
511
+ <BLANKLINE>
512
+ - love(0,0).
513
+ love(0,1).
514
+ - love(1,0).
515
+ - love(1,1).
516
+ <BLANKLINE>
517
+
518
+ Here, we can see that ``adam`` and ``eve`` have been assigned the same
519
+ individual, namely ``0`` as value; ``0`` is both a man and a woman; a second
520
+ individual ``1`` is also a woman; and ``0`` loves ``1``. Thus, this is
521
+ an interpretation in which there is a woman that every man loves but
522
+ Adam doesn't love Eve.
523
+
524
+ Mace can also be used with propositional logic.
525
+
526
+ >>> p = read_expr('P')
527
+ >>> q = read_expr('Q')
528
+ >>> mb = MaceCommand(q, [p, p>-q])
529
+ >>> mb.build_model()
530
+ True
531
+ >>> mb.valuation['P']
532
+ True
533
+ >>> mb.valuation['Q']
534
+ False