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.
- {nltk-3.2 → nltk-3.3}/INSTALL.txt +6 -6
- {nltk-3.2 → nltk-3.3}/LICENSE.txt +13 -13
- {nltk-3.2 → nltk-3.3}/MANIFEST.in +6 -6
- {nltk-3.2/nltk.egg-info → nltk-3.3}/PKG-INFO +13 -5
- nltk-3.2/README.txt → nltk-3.3/README.md +49 -48
- nltk-3.3/nltk/VERSION +1 -0
- {nltk-3.2 → nltk-3.3}/nltk/__init__.py +185 -185
- {nltk-3.2 → nltk-3.3}/nltk/app/__init__.py +52 -53
- {nltk-3.2 → nltk-3.3}/nltk/app/chartparser_app.py +2276 -2276
- {nltk-3.2 → nltk-3.3}/nltk/app/chunkparser_app.py +1262 -1264
- {nltk-3.2 → nltk-3.3}/nltk/app/collocations_app.py +347 -350
- {nltk-3.2 → nltk-3.3}/nltk/app/concordance_app.py +568 -570
- {nltk-3.2 → nltk-3.3}/nltk/app/nemo_app.py +156 -155
- {nltk-3.2 → nltk-3.3}/nltk/app/rdparser_app.py +892 -894
- {nltk-3.2 → nltk-3.3}/nltk/app/srparser_app.py +809 -809
- {nltk-3.2 → nltk-3.3}/nltk/app/wordfreq_app.py +32 -32
- {nltk-3.2 → nltk-3.3}/nltk/app/wordnet_app.py +968 -968
- {nltk-3.2 → nltk-3.3}/nltk/book.py +91 -90
- {nltk-3.2 → nltk-3.3}/nltk/ccg/__init__.py +22 -22
- {nltk-3.2 → nltk-3.3}/nltk/ccg/api.py +359 -335
- {nltk-3.2 → nltk-3.3}/nltk/ccg/chart.py +394 -361
- {nltk-3.2 → nltk-3.3}/nltk/ccg/combinator.py +343 -312
- {nltk-3.2 → nltk-3.3}/nltk/ccg/lexicon.py +328 -290
- nltk-3.3/nltk/ccg/logic.py +46 -0
- {nltk-3.2 → nltk-3.3}/nltk/chat/__init__.py +49 -49
- {nltk-3.2 → nltk-3.3}/nltk/chat/eliza.py +244 -244
- {nltk-3.2 → nltk-3.3}/nltk/chat/iesha.py +140 -140
- {nltk-3.2 → nltk-3.3}/nltk/chat/rude.py +92 -92
- {nltk-3.2 → nltk-3.3}/nltk/chat/suntsu.py +117 -117
- {nltk-3.2 → nltk-3.3}/nltk/chat/util.py +122 -120
- {nltk-3.2 → nltk-3.3}/nltk/chat/zen.py +282 -282
- {nltk-3.2 → nltk-3.3}/nltk/chunk/__init__.py +190 -190
- {nltk-3.2 → nltk-3.3}/nltk/chunk/api.py +51 -51
- {nltk-3.2 → nltk-3.3}/nltk/chunk/named_entity.py +331 -331
- {nltk-3.2 → nltk-3.3}/nltk/chunk/regexp.py +1390 -1384
- {nltk-3.2 → nltk-3.3}/nltk/chunk/util.py +600 -600
- {nltk-3.2 → nltk-3.3}/nltk/classify/__init__.py +98 -98
- {nltk-3.2 → nltk-3.3}/nltk/classify/api.py +193 -193
- {nltk-3.2 → nltk-3.3}/nltk/classify/decisiontree.py +295 -295
- {nltk-3.2 → nltk-3.3}/nltk/classify/maxent.py +1510 -1492
- {nltk-3.2 → nltk-3.3}/nltk/classify/megam.py +179 -178
- {nltk-3.2 → nltk-3.3}/nltk/classify/naivebayes.py +245 -242
- {nltk-3.2 → nltk-3.3}/nltk/classify/positivenaivebayes.py +170 -170
- {nltk-3.2 → nltk-3.3}/nltk/classify/rte_classify.py +160 -191
- {nltk-3.2 → nltk-3.3}/nltk/classify/scikitlearn.py +153 -151
- {nltk-3.2 → nltk-3.3}/nltk/classify/senna.py +183 -181
- {nltk-3.2 → nltk-3.3}/nltk/classify/svm.py +15 -15
- {nltk-3.2 → nltk-3.3}/nltk/classify/tadm.py +113 -112
- {nltk-3.2 → nltk-3.3}/nltk/classify/textcat.py +193 -193
- {nltk-3.2 → nltk-3.3}/nltk/classify/util.py +324 -312
- {nltk-3.2 → nltk-3.3}/nltk/classify/weka.py +346 -345
- {nltk-3.2 → nltk-3.3}/nltk/cluster/__init__.py +86 -86
- {nltk-3.2 → nltk-3.3}/nltk/cluster/api.py +74 -70
- {nltk-3.2 → nltk-3.3}/nltk/cluster/em.py +247 -247
- {nltk-3.2 → nltk-3.3}/nltk/cluster/gaac.py +168 -168
- {nltk-3.2 → nltk-3.3}/nltk/cluster/kmeans.py +221 -221
- {nltk-3.2 → nltk-3.3}/nltk/cluster/util.py +304 -289
- nltk-3.3/nltk/collections.py +640 -0
- {nltk-3.2 → nltk-3.3}/nltk/collocations.py +388 -388
- nltk-3.3/nltk/compat.py +365 -0
- {nltk-3.2 → nltk-3.3}/nltk/corpus/__init__.py +341 -320
- {nltk-3.2 → nltk-3.3}/nltk/corpus/europarl_raw.py +44 -44
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/__init__.py +147 -145
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/aligned.py +115 -114
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/api.py +448 -446
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/bnc.py +252 -252
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/bracket_parse.py +227 -227
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/categorized_sents.py +179 -178
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/chasen.py +140 -139
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/childes.py +522 -494
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/chunked.py +212 -212
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/cmudict.py +97 -95
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/comparative_sents.py +280 -278
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/conll.py +528 -521
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/crubadan.py +116 -116
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/dependency.py +101 -101
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/framenet.py +3059 -2093
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ieer.py +112 -111
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/indian.py +85 -86
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ipipan.py +332 -331
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/knbc.py +187 -187
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/lin.py +156 -156
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/mte.py +311 -310
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/nkjp.py +429 -428
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/nombank.py +421 -421
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/nps_chat.py +73 -73
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/opinion_lexicon.py +115 -115
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/panlex_lite.py +165 -165
- nltk-3.3/nltk/corpus/reader/pl196x.py +292 -0
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/plaintext.py +232 -233
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ppattach.py +96 -95
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/propbank.py +479 -481
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/pros_cons.py +128 -126
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/reviews.py +330 -328
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/rte.py +144 -146
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/semcor.py +256 -256
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/senseval.py +203 -201
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/sentiwordnet.py +137 -137
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/sinica_treebank.py +75 -75
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/string_category.py +60 -59
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/switchboard.py +119 -119
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/tagged.py +295 -294
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/timit.py +452 -450
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/toolbox.py +68 -68
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/twitter.py +155 -157
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/udhr.py +80 -80
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/util.py +804 -800
- nltk-3.3/nltk/corpus/reader/verbnet.py +595 -0
- nltk-3.3/nltk/corpus/reader/wordlist.py +134 -0
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/wordnet.py +2108 -2036
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/xmldocs.py +392 -387
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ycoe.py +243 -242
- {nltk-3.2 → nltk-3.3}/nltk/corpus/util.py +144 -127
- {nltk-3.2 → nltk-3.3}/nltk/data.py +1487 -1451
- {nltk-3.2 → nltk-3.3}/nltk/decorators.py +219 -215
- {nltk-3.2 → nltk-3.3}/nltk/downloader.py +2278 -2274
- {nltk-3.2 → nltk-3.3}/nltk/draw/__init__.py +27 -27
- {nltk-3.2 → nltk-3.3}/nltk/draw/cfg.py +774 -777
- {nltk-3.2 → nltk-3.3}/nltk/draw/dispersion.py +58 -58
- {nltk-3.2 → nltk-3.3}/nltk/draw/table.py +1098 -1098
- {nltk-3.2 → nltk-3.3}/nltk/draw/tree.py +963 -966
- {nltk-3.2 → nltk-3.3}/nltk/draw/util.py +2356 -2356
- {nltk-3.2 → nltk-3.3}/nltk/featstruct.py +2617 -2500
- {nltk-3.2 → nltk-3.3}/nltk/grammar.py +1559 -1516
- {nltk-3.2 → nltk-3.3}/nltk/help.py +56 -56
- {nltk-3.2 → nltk-3.3}/nltk/inference/__init__.py +20 -20
- {nltk-3.2 → nltk-3.3}/nltk/inference/api.py +597 -589
- {nltk-3.2 → nltk-3.3}/nltk/inference/discourse.py +612 -608
- {nltk-3.2 → nltk-3.3}/nltk/inference/mace.py +311 -311
- {nltk-3.2 → nltk-3.3}/nltk/inference/nonmonotonic.py +509 -509
- {nltk-3.2 → nltk-3.3}/nltk/inference/prover9.py +431 -431
- {nltk-3.2 → nltk-3.3}/nltk/inference/resolution.py +687 -687
- {nltk-3.2 → nltk-3.3}/nltk/inference/tableau.py +607 -607
- {nltk-3.2 → nltk-3.3}/nltk/internals.py +982 -982
- {nltk-3.2 → nltk-3.3}/nltk/jsontags.py +63 -63
- {nltk-3.2 → nltk-3.3}/nltk/lazyimport.py +142 -142
- {nltk-3.2 → nltk-3.3}/nltk/metrics/__init__.py +30 -29
- {nltk-3.2 → nltk-3.3}/nltk/metrics/agreement.py +421 -401
- nltk-3.3/nltk/metrics/aline.py +607 -0
- {nltk-3.2 → nltk-3.3}/nltk/metrics/association.py +414 -410
- {nltk-3.2 → nltk-3.3}/nltk/metrics/confusionmatrix.py +206 -206
- {nltk-3.2 → nltk-3.3}/nltk/metrics/distance.py +207 -202
- {nltk-3.2 → nltk-3.3}/nltk/metrics/paice.py +381 -381
- {nltk-3.2 → nltk-3.3}/nltk/metrics/scores.py +228 -228
- {nltk-3.2 → nltk-3.3}/nltk/metrics/segmentation.py +231 -232
- {nltk-3.2 → nltk-3.3}/nltk/metrics/spearman.py +69 -69
- {nltk-3.2 → nltk-3.3}/nltk/misc/__init__.py +11 -11
- {nltk-3.2 → nltk-3.3}/nltk/misc/babelfish.py +10 -10
- {nltk-3.2 → nltk-3.3}/nltk/misc/chomsky.py +135 -133
- {nltk-3.2 → nltk-3.3}/nltk/misc/minimalset.py +83 -83
- {nltk-3.2 → nltk-3.3}/nltk/misc/sort.py +157 -157
- {nltk-3.2 → nltk-3.3}/nltk/misc/wordfinder.py +129 -129
- {nltk-3.2 → nltk-3.3}/nltk/parse/__init__.py +81 -80
- {nltk-3.2 → nltk-3.3}/nltk/parse/api.py +66 -66
- {nltk-3.2 → nltk-3.3}/nltk/parse/bllip.py +282 -282
- {nltk-3.2 → nltk-3.3}/nltk/parse/chart.py +1682 -1681
- nltk-3.3/nltk/parse/corenlp.py +780 -0
- {nltk-3.2 → nltk-3.3}/nltk/parse/dependencygraph.py +760 -758
- {nltk-3.2 → nltk-3.3}/nltk/parse/earleychart.py +452 -451
- {nltk-3.2 → nltk-3.3}/nltk/parse/evaluate.py +129 -129
- {nltk-3.2 → nltk-3.3}/nltk/parse/featurechart.py +580 -578
- {nltk-3.2 → nltk-3.3}/nltk/parse/generate.py +87 -76
- {nltk-3.2 → nltk-3.3}/nltk/parse/malt.py +356 -356
- {nltk-3.2 → nltk-3.3}/nltk/parse/nonprojectivedependencyparser.py +783 -783
- {nltk-3.2 → nltk-3.3}/nltk/parse/pchart.py +522 -522
- {nltk-3.2 → nltk-3.3}/nltk/parse/projectivedependencyparser.py +579 -578
- {nltk-3.2 → nltk-3.3}/nltk/parse/recursivedescent.py +655 -656
- {nltk-3.2 → nltk-3.3}/nltk/parse/shiftreduce.py +458 -459
- {nltk-3.2 → nltk-3.3}/nltk/parse/stanford.py +431 -406
- {nltk-3.2 → nltk-3.3}/nltk/parse/transitionparser.py +774 -772
- {nltk-3.2 → nltk-3.3}/nltk/parse/util.py +231 -231
- {nltk-3.2 → nltk-3.3}/nltk/parse/viterbi.py +401 -401
- {nltk-3.2 → nltk-3.3}/nltk/probability.py +2410 -2355
- {nltk-3.2 → nltk-3.3}/nltk/sem/__init__.py +61 -61
- {nltk-3.2 → nltk-3.3}/nltk/sem/boxer.py +1261 -1261
- {nltk-3.2 → nltk-3.3}/nltk/sem/chat80.py +782 -782
- {nltk-3.2 → nltk-3.3}/nltk/sem/cooper_storage.py +118 -118
- {nltk-3.2 → nltk-3.3}/nltk/sem/drt.py +1258 -1257
- {nltk-3.2 → nltk-3.3}/nltk/sem/drt_glue_demo.py +485 -489
- {nltk-3.2 → nltk-3.3}/nltk/sem/evaluate.py +790 -784
- {nltk-3.2 → nltk-3.3}/nltk/sem/glue.py +696 -694
- {nltk-3.2 → nltk-3.3}/nltk/sem/hole.py +386 -384
- {nltk-3.2 → nltk-3.3}/nltk/sem/lfg.py +210 -208
- {nltk-3.2 → nltk-3.3}/nltk/sem/linearlogic.py +451 -449
- {nltk-3.2 → nltk-3.3}/nltk/sem/logic.py +1910 -1910
- {nltk-3.2 → nltk-3.3}/nltk/sem/relextract.py +476 -483
- {nltk-3.2 → nltk-3.3}/nltk/sem/skolemize.py +101 -101
- {nltk-3.2 → nltk-3.3}/nltk/sem/util.py +249 -249
- {nltk-3.2 → nltk-3.3}/nltk/sentiment/__init__.py +14 -14
- {nltk-3.2 → nltk-3.3}/nltk/sentiment/sentiment_analyzer.py +229 -229
- {nltk-3.2 → nltk-3.3}/nltk/sentiment/util.py +762 -752
- {nltk-3.2 → nltk-3.3}/nltk/sentiment/vader.py +443 -445
- {nltk-3.2 → nltk-3.3}/nltk/stem/__init__.py +31 -33
- {nltk-3.2 → nltk-3.3}/nltk/stem/api.py +28 -25
- nltk-3.3/nltk/stem/arlstem.py +369 -0
- {nltk-3.2 → nltk-3.3}/nltk/stem/isri.py +345 -345
- {nltk-3.2 → nltk-3.3}/nltk/stem/lancaster.py +337 -310
- nltk-3.3/nltk/stem/porter.py +710 -0
- {nltk-3.2 → nltk-3.3}/nltk/stem/regexp.py +61 -61
- {nltk-3.2 → nltk-3.3}/nltk/stem/rslp.py +142 -142
- {nltk-3.2 → nltk-3.3}/nltk/stem/snowball.py +4236 -3712
- {nltk-3.2 → nltk-3.3}/nltk/stem/util.py +22 -12
- {nltk-3.2 → nltk-3.3}/nltk/stem/wordnet.py +51 -51
- {nltk-3.2 → nltk-3.3}/nltk/tag/__init__.py +152 -127
- {nltk-3.2 → nltk-3.3}/nltk/tag/api.py +86 -81
- {nltk-3.2 → nltk-3.3}/nltk/tag/brill.py +424 -426
- {nltk-3.2 → nltk-3.3}/nltk/tag/brill_trainer.py +608 -608
- {nltk-3.2 → nltk-3.3}/nltk/tag/crf.py +204 -200
- {nltk-3.2 → nltk-3.3}/nltk/tag/hmm.py +1277 -1277
- {nltk-3.2 → nltk-3.3}/nltk/tag/hunpos.py +132 -132
- {nltk-3.2 → nltk-3.3}/nltk/tag/mapping.py +101 -101
- {nltk-3.2 → nltk-3.3}/nltk/tag/perceptron.py +329 -314
- {nltk-3.2 → nltk-3.3}/nltk/tag/senna.py +147 -145
- {nltk-3.2 → nltk-3.3}/nltk/tag/sequential.py +740 -736
- {nltk-3.2 → nltk-3.3}/nltk/tag/stanford.py +219 -196
- {nltk-3.2 → nltk-3.3}/nltk/tag/tnt.py +595 -604
- {nltk-3.2 → nltk-3.3}/nltk/tag/util.py +72 -72
- {nltk-3.2 → nltk-3.3}/nltk/tbl/__init__.py +28 -28
- {nltk-3.2 → nltk-3.3}/nltk/tbl/api.py +1 -1
- {nltk-3.2 → nltk-3.3}/nltk/tbl/demo.py +366 -366
- {nltk-3.2 → nltk-3.3}/nltk/tbl/erroranalysis.py +39 -39
- {nltk-3.2 → nltk-3.3}/nltk/tbl/feature.py +259 -261
- {nltk-3.2 → nltk-3.3}/nltk/tbl/rule.py +321 -321
- {nltk-3.2 → nltk-3.3}/nltk/tbl/template.py +303 -308
- {nltk-3.2 → nltk-3.3}/nltk/test/__init__.py +18 -18
- {nltk-3.2 → nltk-3.3}/nltk/test/all.py +24 -23
- {nltk-3.2 → nltk-3.3}/nltk/test/bleu.doctest +14 -14
- {nltk-3.2 → nltk-3.3}/nltk/test/bnc.doctest +60 -60
- {nltk-3.2 → nltk-3.3}/nltk/test/ccg.doctest +376 -395
- nltk-3.3/nltk/test/ccg_semantics.doctest +553 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/chat80.doctest +234 -234
- {nltk-3.2 → nltk-3.3}/nltk/test/childes.doctest +184 -184
- {nltk-3.2 → nltk-3.3}/nltk/test/childes_fixt.py +14 -13
- {nltk-3.2 → nltk-3.3}/nltk/test/chunk.doctest +373 -373
- {nltk-3.2 → nltk-3.3}/nltk/test/classify.doctest +185 -185
- {nltk-3.2 → nltk-3.3}/nltk/test/classify_fixt.py +11 -10
- nltk-3.3/nltk/test/collections.doctest +20 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/collocations.doctest +276 -276
- {nltk-3.2 → nltk-3.3}/nltk/test/compat.doctest +134 -138
- {nltk-3.2 → nltk-3.3}/nltk/test/compat_fixt.py +9 -8
- nltk-3.3/nltk/test/concordance.doctest +55 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/corpus.doctest +2200 -2212
- {nltk-3.2 → nltk-3.3}/nltk/test/corpus_fixt.py +3 -3
- {nltk-3.2 → nltk-3.3}/nltk/test/crubadan.doctest +65 -65
- {nltk-3.2 → nltk-3.3}/nltk/test/data.doctest +379 -379
- {nltk-3.2 → nltk-3.3}/nltk/test/dependency.doctest +241 -241
- {nltk-3.2 → nltk-3.3}/nltk/test/discourse.doctest +546 -546
- {nltk-3.2 → nltk-3.3}/nltk/test/discourse_fixt.py +14 -13
- {nltk-3.2 → nltk-3.3}/nltk/test/doctest_nose_plugin.py +159 -156
- {nltk-3.2 → nltk-3.3}/nltk/test/drt.doctest +517 -517
- {nltk-3.2 → nltk-3.3}/nltk/test/featgram.doctest +607 -607
- {nltk-3.2 → nltk-3.3}/nltk/test/featstruct.doctest +1229 -1230
- {nltk-3.2 → nltk-3.3}/nltk/test/framenet.doctest +288 -239
- {nltk-3.2 → nltk-3.3}/nltk/test/generate.doctest +67 -67
- {nltk-3.2 → nltk-3.3}/nltk/test/gensim.doctest +140 -141
- {nltk-3.2 → nltk-3.3}/nltk/test/gensim_fixt.py +10 -9
- {nltk-3.2 → nltk-3.3}/nltk/test/gluesemantics.doctest +384 -386
- {nltk-3.2 → nltk-3.3}/nltk/test/gluesemantics_malt.doctest +68 -68
- {nltk-3.2 → nltk-3.3}/nltk/test/gluesemantics_malt_fixt.py +12 -11
- {nltk-3.2 → nltk-3.3}/nltk/test/grammar.doctest +48 -48
- {nltk-3.2 → nltk-3.3}/nltk/test/grammartestsuites.doctest +109 -109
- {nltk-3.2 → nltk-3.3}/nltk/test/index.doctest +100 -100
- {nltk-3.2 → nltk-3.3}/nltk/test/inference.doctest +534 -534
- {nltk-3.2 → nltk-3.3}/nltk/test/inference_fixt.py +12 -11
- {nltk-3.2 → nltk-3.3}/nltk/test/internals.doctest +140 -140
- {nltk-3.2 → nltk-3.3}/nltk/test/japanese.doctest +48 -48
- {nltk-3.2 → nltk-3.3}/nltk/test/logic.doctest +1098 -1098
- {nltk-3.2 → nltk-3.3}/nltk/test/metrics.doctest +270 -270
- {nltk-3.2 → nltk-3.3}/nltk/test/misc.doctest +118 -118
- {nltk-3.2 → nltk-3.3}/nltk/test/nonmonotonic.doctest +286 -286
- {nltk-3.2 → nltk-3.3}/nltk/test/nonmonotonic_fixt.py +12 -11
- {nltk-3.2 → nltk-3.3}/nltk/test/paice.doctest +35 -35
- {nltk-3.2 → nltk-3.3}/nltk/test/parse.doctest +884 -884
- {nltk-3.2 → nltk-3.3}/nltk/test/portuguese_en.doctest +565 -565
- {nltk-3.2 → nltk-3.3}/nltk/test/portuguese_en_fixt.py +16 -16
- {nltk-3.2 → nltk-3.3}/nltk/test/probability.doctest +304 -304
- {nltk-3.2 → nltk-3.3}/nltk/test/probability_fixt.py +13 -12
- {nltk-3.2 → nltk-3.3}/nltk/test/propbank.doctest +176 -176
- {nltk-3.2 → nltk-3.3}/nltk/test/relextract.doctest +263 -263
- {nltk-3.2 → nltk-3.3}/nltk/test/resolution.doctest +221 -221
- {nltk-3.2 → nltk-3.3}/nltk/test/runtests.py +86 -64
- {nltk-3.2 → nltk-3.3}/nltk/test/segmentation_fixt.py +10 -10
- {nltk-3.2 → nltk-3.3}/nltk/test/semantics.doctest +665 -665
- {nltk-3.2 → nltk-3.3}/nltk/test/semantics_fixt.py +7 -7
- {nltk-3.2 → nltk-3.3}/nltk/test/sentiment.doctest +233 -233
- {nltk-3.2 → nltk-3.3}/nltk/test/sentiwordnet.doctest +41 -41
- {nltk-3.2 → nltk-3.3}/nltk/test/simple.doctest +85 -85
- {nltk-3.2 → nltk-3.3}/nltk/test/stem.doctest +78 -78
- {nltk-3.2 → nltk-3.3}/nltk/test/tag.doctest +33 -33
- {nltk-3.2 → nltk-3.3}/nltk/test/tokenize.doctest +273 -166
- {nltk-3.2 → nltk-3.3}/nltk/test/toolbox.doctest +307 -307
- {nltk-3.2 → nltk-3.3}/nltk/test/translate.doctest +242 -242
- {nltk-3.2 → nltk-3.3}/nltk/test/translate_fixt.py +3 -3
- {nltk-3.2 → nltk-3.3}/nltk/test/tree.doctest +1101 -1101
- {nltk-3.2 → nltk-3.3}/nltk/test/treeprettyprinter.doctest +127 -127
- {nltk-3.2 → nltk-3.3}/nltk/test/treetransforms.doctest +156 -156
- nltk-3.3/nltk/test/unit/test_2x_compat.py +63 -0
- nltk-3.3/nltk/test/unit/test_aline.py +52 -0
- nltk-3.3/nltk/test/unit/test_chunk.py +56 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_classify.py +55 -53
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_collocations.py +88 -79
- nltk-3.3/nltk/test/unit/test_concordance.py +98 -0
- nltk-3.3/nltk/test/unit/test_corenlp.py +1000 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_corpora.py +200 -183
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_corpus_views.py +45 -45
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_hmm.py +88 -88
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_json2csv_corpus.py +188 -187
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_naivebayes.py +26 -26
- nltk-3.3/nltk/test/unit/test_rte_classify.py +86 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_seekable_unicode_stream_reader.py +124 -124
- nltk-3.3/nltk/test/unit/test_senna.py +74 -0
- nltk-3.3/nltk/test/unit/test_stem.py +121 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_tag.py +20 -20
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_tgrep.py +628 -626
- nltk-3.3/nltk/test/unit/test_tokenize.py +168 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_twitter_auth.py +185 -185
- nltk-3.3/nltk/test/unit/test_wordnet.py +134 -0
- nltk-3.3/nltk/test/unit/translate/test_bleu.py +244 -0
- nltk-3.3/nltk/test/unit/translate/test_gdfa.py +57 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm1.py +75 -75
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm2.py +87 -87
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm3.py +105 -105
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm4.py +126 -126
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm5.py +166 -166
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm_model.py +270 -270
- nltk-3.3/nltk/test/unit/translate/test_nist.py +37 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_stack_decoder.py +300 -300
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/utils.py +41 -41
- {nltk-3.2 → nltk-3.3}/nltk/test/util.doctest +48 -48
- {nltk-3.2 → nltk-3.3}/nltk/test/wordnet.doctest +595 -581
- {nltk-3.2 → nltk-3.3}/nltk/test/wordnet_fixt.py +7 -6
- {nltk-3.2 → nltk-3.3}/nltk/test/wordnet_lch.doctest +53 -53
- {nltk-3.2 → nltk-3.3}/nltk/test/wsd.doctest +68 -68
- {nltk-3.2 → nltk-3.3}/nltk/text.py +663 -610
- {nltk-3.2 → nltk-3.3}/nltk/tgrep.py +938 -937
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/__init__.py +130 -107
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/api.py +77 -78
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/casual.py +343 -342
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/mwe.py +120 -120
- nltk-3.3/nltk/tokenize/nist.py +173 -0
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/punkt.py +1620 -1601
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/regexp.py +208 -202
- nltk-3.3/nltk/tokenize/repp.py +151 -0
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/sexpr.py +140 -142
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/simple.py +138 -136
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/stanford.py +117 -113
- nltk-3.3/nltk/tokenize/stanford_segmenter.py +246 -0
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/texttiling.py +458 -460
- nltk-3.3/nltk/tokenize/toktok.py +155 -0
- nltk-3.3/nltk/tokenize/treebank.py +363 -0
- nltk-3.3/nltk/tokenize/util.py +261 -0
- {nltk-3.2 → nltk-3.3}/nltk/toolbox.py +499 -497
- {nltk-3.2 → nltk-3.3}/nltk/translate/__init__.py +24 -24
- {nltk-3.2 → nltk-3.3}/nltk/translate/api.py +331 -321
- {nltk-3.2 → nltk-3.3}/nltk/translate/bleu_score.py +615 -556
- nltk-3.3/nltk/translate/chrf_score.py +137 -0
- {nltk-3.2 → nltk-3.3}/nltk/translate/gale_church.py +248 -235
- {nltk-3.2 → nltk-3.3}/nltk/translate/gdfa.py +135 -131
- nltk-3.3/nltk/translate/gleu_score.py +193 -0
- {nltk-3.2 → nltk-3.3}/nltk/translate/ibm1.py +250 -241
- {nltk-3.2 → nltk-3.3}/nltk/translate/ibm2.py +308 -308
- {nltk-3.2 → nltk-3.3}/nltk/translate/ibm3.py +337 -337
- {nltk-3.2 → nltk-3.3}/nltk/translate/ibm4.py +467 -467
- {nltk-3.2 → nltk-3.3}/nltk/translate/ibm5.py +639 -639
- {nltk-3.2 → nltk-3.3}/nltk/translate/ibm_model.py +536 -533
- {nltk-3.2 → nltk-3.3}/nltk/translate/metrics.py +40 -40
- nltk-3.3/nltk/translate/nist_score.py +178 -0
- {nltk-3.2 → nltk-3.3}/nltk/translate/phrase_based.py +175 -175
- {nltk-3.2 → nltk-3.3}/nltk/translate/ribes_score.py +325 -325
- {nltk-3.2 → nltk-3.3}/nltk/translate/stack_decoder.py +499 -495
- {nltk-3.2 → nltk-3.3}/nltk/tree.py +1605 -1603
- {nltk-3.2 → nltk-3.3}/nltk/treeprettyprinter.py +564 -564
- {nltk-3.2 → nltk-3.3}/nltk/treetransforms.py +309 -309
- {nltk-3.2 → nltk-3.3}/nltk/twitter/__init__.py +28 -28
- {nltk-3.2 → nltk-3.3}/nltk/twitter/api.py +141 -136
- {nltk-3.2 → nltk-3.3}/nltk/twitter/common.py +264 -258
- {nltk-3.2 → nltk-3.3}/nltk/twitter/twitter_demo.py +288 -288
- {nltk-3.2 → nltk-3.3}/nltk/twitter/twitterclient.py +530 -530
- {nltk-3.2 → nltk-3.3}/nltk/twitter/util.py +147 -146
- nltk-3.3/nltk/util.py +751 -0
- {nltk-3.2 → nltk-3.3}/nltk/wsd.py +53 -53
- {nltk-3.2 → nltk-3.3/nltk.egg-info}/PKG-INFO +13 -5
- {nltk-3.2 → nltk-3.3}/nltk.egg-info/SOURCES.txt +26 -3
- nltk-3.3/nltk.egg-info/requires.txt +31 -0
- {nltk-3.2 → nltk-3.3}/setup.cfg +0 -1
- {nltk-3.2 → nltk-3.3}/setup.py +102 -75
- nltk-3.2/nltk/VERSION +0 -1
- nltk-3.2/nltk/compat.py +0 -680
- nltk-3.2/nltk/corpus/reader/pl196x.py +0 -278
- nltk-3.2/nltk/corpus/reader/verbnet.py +0 -408
- nltk-3.2/nltk/corpus/reader/wordlist.py +0 -37
- nltk-3.2/nltk/sentiment/vader_lexicon.txt +0 -7517
- nltk-3.2/nltk/six.py +0 -868
- nltk-3.2/nltk/stem/porter.py +0 -692
- nltk-3.2/nltk/test/unit/test_2x_compat.py +0 -26
- nltk-3.2/nltk/test/unit/test_stem.py +0 -36
- nltk-3.2/nltk/test/unit/test_tokenize.py +0 -23
- nltk-3.2/nltk/test/unit/translate/test_bleu.py +0 -84
- nltk-3.2/nltk/tokenize/treebank.py +0 -124
- nltk-3.2/nltk/tokenize/util.py +0 -90
- nltk-3.2/nltk/util.py +0 -1364
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/__init__.py +0 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/__init__.py +0 -0
- {nltk-3.2 → nltk-3.3}/nltk.egg-info/dependency_links.txt +0 -0
- {nltk-3.2 → nltk-3.3}/nltk.egg-info/not-zip-safe +0 -0
- {nltk-3.2 → nltk-3.3}/nltk.egg-info/top_level.txt +0 -0
|
@@ -1,431 +1,431 @@
|
|
|
1
|
-
# Natural Language Toolkit: Interface to the Prover9 Theorem Prover
|
|
2
|
-
#
|
|
3
|
-
# Copyright (C) 2001-
|
|
4
|
-
# Author: Dan Garrette <dhgarrette@gmail.com>
|
|
5
|
-
# Ewan Klein <ewan@inf.ed.ac.uk>
|
|
6
|
-
#
|
|
7
|
-
# URL: <http://nltk.org/>
|
|
8
|
-
# For license information, see LICENSE.TXT
|
|
9
|
-
"""
|
|
10
|
-
A theorem prover that makes use of the external 'Prover9' package.
|
|
11
|
-
"""
|
|
12
|
-
from __future__ import print_function
|
|
13
|
-
|
|
14
|
-
import os
|
|
15
|
-
import subprocess
|
|
16
|
-
|
|
17
|
-
import nltk
|
|
18
|
-
from nltk.sem.logic import Expression, ExistsExpression, AllExpression, \
|
|
19
|
-
NegatedExpression, AndExpression, IffExpression, OrExpression, \
|
|
20
|
-
EqualityExpression, ImpExpression
|
|
21
|
-
from nltk.inference.api import BaseProverCommand, Prover
|
|
22
|
-
|
|
23
|
-
#
|
|
24
|
-
# Following is not yet used. Return code for 2 actually realized as 512.
|
|
25
|
-
#
|
|
26
|
-
p9_return_codes = {
|
|
27
|
-
0: True,
|
|
28
|
-
1: "(FATAL)", #A fatal error occurred (user's syntax error).
|
|
29
|
-
2: False, # (SOS_EMPTY) Prover9 ran out of things to do
|
|
30
|
-
# (sos list exhausted).
|
|
31
|
-
3: "(MAX_MEGS)", # The max_megs (memory limit) parameter was exceeded.
|
|
32
|
-
4: "(MAX_SECONDS)", # The max_seconds parameter was exceeded.
|
|
33
|
-
5: "(MAX_GIVEN)", # The max_given parameter was exceeded.
|
|
34
|
-
6: "(MAX_KEPT)", # The max_kept parameter was exceeded.
|
|
35
|
-
7: "(ACTION)", # A Prover9 action terminated the search.
|
|
36
|
-
101: "(SIGSEGV)", # Prover9 crashed, most probably due to a bug.
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
class Prover9CommandParent(object):
|
|
41
|
-
"""
|
|
42
|
-
A common base class used by both ``Prover9Command`` and ``MaceCommand``,
|
|
43
|
-
which is responsible for maintaining a goal and a set of assumptions,
|
|
44
|
-
and generating prover9-style input files from them.
|
|
45
|
-
"""
|
|
46
|
-
def print_assumptions(self, output_format='nltk'):
|
|
47
|
-
"""
|
|
48
|
-
Print the list of the current assumptions.
|
|
49
|
-
"""
|
|
50
|
-
if output_format.lower() == 'nltk':
|
|
51
|
-
for a in self.assumptions():
|
|
52
|
-
print(a)
|
|
53
|
-
elif output_format.lower() == 'prover9':
|
|
54
|
-
for a in convert_to_prover9(self.assumptions()):
|
|
55
|
-
print(a)
|
|
56
|
-
else:
|
|
57
|
-
raise NameError("Unrecognized value for 'output_format': %s" %
|
|
58
|
-
output_format)
|
|
59
|
-
|
|
60
|
-
class Prover9Command(Prover9CommandParent, BaseProverCommand):
|
|
61
|
-
"""
|
|
62
|
-
A ``ProverCommand`` specific to the ``Prover9`` prover. It contains
|
|
63
|
-
the a print_assumptions() method that is used to print the list
|
|
64
|
-
of assumptions in multiple formats.
|
|
65
|
-
"""
|
|
66
|
-
def __init__(self, goal=None, assumptions=None, timeout=60, prover=None):
|
|
67
|
-
"""
|
|
68
|
-
:param goal: Input expression to prove
|
|
69
|
-
:type goal: sem.Expression
|
|
70
|
-
:param assumptions: Input expressions to use as assumptions in
|
|
71
|
-
the proof.
|
|
72
|
-
:type assumptions: list(sem.Expression)
|
|
73
|
-
:param timeout: number of seconds before timeout; set to 0 for
|
|
74
|
-
no timeout.
|
|
75
|
-
:type timeout: int
|
|
76
|
-
:param prover: a prover. If not set, one will be created.
|
|
77
|
-
:type prover: Prover9
|
|
78
|
-
"""
|
|
79
|
-
if not assumptions:
|
|
80
|
-
assumptions = []
|
|
81
|
-
|
|
82
|
-
if prover is not None:
|
|
83
|
-
assert isinstance(prover, Prover9)
|
|
84
|
-
else:
|
|
85
|
-
prover = Prover9(timeout)
|
|
86
|
-
|
|
87
|
-
BaseProverCommand.__init__(self, prover, goal, assumptions)
|
|
88
|
-
|
|
89
|
-
def decorate_proof(self, proof_string, simplify=True):
|
|
90
|
-
"""
|
|
91
|
-
:see BaseProverCommand.decorate_proof()
|
|
92
|
-
"""
|
|
93
|
-
if simplify:
|
|
94
|
-
return self._prover._call_prooftrans(proof_string, ['striplabels'])[0].rstrip()
|
|
95
|
-
else:
|
|
96
|
-
return proof_string.rstrip()
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
class Prover9Parent(object):
|
|
100
|
-
"""
|
|
101
|
-
A common class extended by both ``Prover9`` and ``Mace <mace.Mace>``.
|
|
102
|
-
It contains the functionality required to convert NLTK-style
|
|
103
|
-
expressions into Prover9-style expressions.
|
|
104
|
-
"""
|
|
105
|
-
|
|
106
|
-
_binary_location = None
|
|
107
|
-
|
|
108
|
-
def config_prover9(self, binary_location, verbose=False):
|
|
109
|
-
if binary_location is None:
|
|
110
|
-
self._binary_location = None
|
|
111
|
-
self._prover9_bin = None
|
|
112
|
-
else:
|
|
113
|
-
name = 'prover9'
|
|
114
|
-
self._prover9_bin = nltk.internals.find_binary(
|
|
115
|
-
name,
|
|
116
|
-
path_to_bin=binary_location,
|
|
117
|
-
env_vars=['PROVER9'],
|
|
118
|
-
url='http://www.cs.unm.edu/~mccune/prover9/',
|
|
119
|
-
binary_names=[name, name + '.exe'],
|
|
120
|
-
verbose=verbose)
|
|
121
|
-
self._binary_location = self._prover9_bin.rsplit(os.path.sep, 1)
|
|
122
|
-
|
|
123
|
-
def prover9_input(self, goal, assumptions):
|
|
124
|
-
"""
|
|
125
|
-
:return: The input string that should be provided to the
|
|
126
|
-
prover9 binary. This string is formed based on the goal,
|
|
127
|
-
assumptions, and timeout value of this object.
|
|
128
|
-
"""
|
|
129
|
-
s = ''
|
|
130
|
-
|
|
131
|
-
if assumptions:
|
|
132
|
-
s += 'formulas(assumptions).\n'
|
|
133
|
-
for p9_assumption in convert_to_prover9(assumptions):
|
|
134
|
-
s += ' %s.\n' % p9_assumption
|
|
135
|
-
s += 'end_of_list.\n\n'
|
|
136
|
-
|
|
137
|
-
if goal:
|
|
138
|
-
s += 'formulas(goals).\n'
|
|
139
|
-
s += ' %s.\n' % convert_to_prover9(goal)
|
|
140
|
-
s += 'end_of_list.\n\n'
|
|
141
|
-
|
|
142
|
-
return s
|
|
143
|
-
|
|
144
|
-
def binary_locations(self):
|
|
145
|
-
"""
|
|
146
|
-
A list of directories that should be searched for the prover9
|
|
147
|
-
executables. This list is used by ``config_prover9`` when searching
|
|
148
|
-
for the prover9 executables.
|
|
149
|
-
"""
|
|
150
|
-
return ['/usr/local/bin/prover9',
|
|
151
|
-
'/usr/local/bin/prover9/bin',
|
|
152
|
-
'/usr/local/bin',
|
|
153
|
-
'/usr/bin',
|
|
154
|
-
'/usr/local/prover9',
|
|
155
|
-
'/usr/local/share/prover9']
|
|
156
|
-
|
|
157
|
-
def _find_binary(self, name, verbose=False):
|
|
158
|
-
binary_locations = self.binary_locations()
|
|
159
|
-
if self._binary_location is not None:
|
|
160
|
-
binary_locations += [self._binary_location]
|
|
161
|
-
return nltk.internals.find_binary(name,
|
|
162
|
-
searchpath=binary_locations,
|
|
163
|
-
env_vars=['PROVER9'],
|
|
164
|
-
url='http://www.cs.unm.edu/~mccune/prover9/',
|
|
165
|
-
binary_names=[name, name + '.exe'],
|
|
166
|
-
verbose=verbose)
|
|
167
|
-
|
|
168
|
-
def _call(self, input_str, binary, args=[], verbose=False):
|
|
169
|
-
"""
|
|
170
|
-
Call the binary with the given input.
|
|
171
|
-
|
|
172
|
-
:param input_str: A string whose contents are used as stdin.
|
|
173
|
-
:param binary: The location of the binary to call
|
|
174
|
-
:param args: A list of command-line arguments.
|
|
175
|
-
:return: A tuple (stdout, returncode)
|
|
176
|
-
:see: ``config_prover9``
|
|
177
|
-
"""
|
|
178
|
-
if verbose:
|
|
179
|
-
print('Calling:', binary)
|
|
180
|
-
print('Args:', args)
|
|
181
|
-
print('Input:\n', input_str, '\n')
|
|
182
|
-
|
|
183
|
-
# Call prover9 via a subprocess
|
|
184
|
-
cmd = [binary] + args
|
|
185
|
-
try:
|
|
186
|
-
input_str = input_str.encode("utf8")
|
|
187
|
-
except AttributeError:
|
|
188
|
-
pass
|
|
189
|
-
p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
|
|
190
|
-
stderr=subprocess.STDOUT,
|
|
191
|
-
stdin=subprocess.PIPE)
|
|
192
|
-
(stdout, stderr) = p.communicate(input=input_str)
|
|
193
|
-
|
|
194
|
-
if verbose:
|
|
195
|
-
print('Return code:', p.returncode)
|
|
196
|
-
if stdout: print('stdout:\n', stdout, '\n')
|
|
197
|
-
if stderr: print('stderr:\n', stderr, '\n')
|
|
198
|
-
|
|
199
|
-
return (stdout.decode("utf-8"), p.returncode)
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
def convert_to_prover9(input):
|
|
203
|
-
"""
|
|
204
|
-
Convert a ``logic.Expression`` to Prover9 format.
|
|
205
|
-
"""
|
|
206
|
-
if isinstance(input, list):
|
|
207
|
-
result = []
|
|
208
|
-
for s in input:
|
|
209
|
-
try:
|
|
210
|
-
result.append(_convert_to_prover9(s.simplify()))
|
|
211
|
-
except:
|
|
212
|
-
print('input %s cannot be converted to Prover9 input syntax' % input)
|
|
213
|
-
raise
|
|
214
|
-
return result
|
|
215
|
-
else:
|
|
216
|
-
try:
|
|
217
|
-
return _convert_to_prover9(input.simplify())
|
|
218
|
-
except:
|
|
219
|
-
print('input %s cannot be converted to Prover9 input syntax' % input)
|
|
220
|
-
raise
|
|
221
|
-
|
|
222
|
-
def _convert_to_prover9(expression):
|
|
223
|
-
"""
|
|
224
|
-
Convert ``logic.Expression`` to Prover9 formatted string.
|
|
225
|
-
"""
|
|
226
|
-
if isinstance(expression, ExistsExpression):
|
|
227
|
-
return 'exists ' + str(expression.variable) + ' ' + _convert_to_prover9(expression.term)
|
|
228
|
-
elif isinstance(expression, AllExpression):
|
|
229
|
-
return 'all ' + str(expression.variable) + ' ' + _convert_to_prover9(expression.term)
|
|
230
|
-
elif isinstance(expression, NegatedExpression):
|
|
231
|
-
return '-(' + _convert_to_prover9(expression.term) + ')'
|
|
232
|
-
elif isinstance(expression, AndExpression):
|
|
233
|
-
return '(' + _convert_to_prover9(expression.first) + ' & ' + \
|
|
234
|
-
_convert_to_prover9(expression.second) + ')'
|
|
235
|
-
elif isinstance(expression, OrExpression):
|
|
236
|
-
return '(' + _convert_to_prover9(expression.first) + ' | ' + \
|
|
237
|
-
_convert_to_prover9(expression.second) + ')'
|
|
238
|
-
elif isinstance(expression, ImpExpression):
|
|
239
|
-
return '(' + _convert_to_prover9(expression.first) + ' -> ' + \
|
|
240
|
-
_convert_to_prover9(expression.second) + ')'
|
|
241
|
-
elif isinstance(expression, IffExpression):
|
|
242
|
-
return '(' + _convert_to_prover9(expression.first) + ' <-> ' + \
|
|
243
|
-
_convert_to_prover9(expression.second) + ')'
|
|
244
|
-
elif isinstance(expression, EqualityExpression):
|
|
245
|
-
return '(' + _convert_to_prover9(expression.first) + ' = ' + \
|
|
246
|
-
_convert_to_prover9(expression.second) + ')'
|
|
247
|
-
else:
|
|
248
|
-
return str(expression)
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
class Prover9(Prover9Parent, Prover):
|
|
252
|
-
_prover9_bin = None
|
|
253
|
-
_prooftrans_bin = None
|
|
254
|
-
|
|
255
|
-
def __init__(self, timeout=60):
|
|
256
|
-
self._timeout = timeout
|
|
257
|
-
"""The timeout value for prover9. If a proof can not be found
|
|
258
|
-
in this amount of time, then prover9 will return false.
|
|
259
|
-
(Use 0 for no timeout.)"""
|
|
260
|
-
|
|
261
|
-
def _prove(self, goal=None, assumptions=None, verbose=False):
|
|
262
|
-
"""
|
|
263
|
-
Use Prover9 to prove a theorem.
|
|
264
|
-
:return: A pair whose first element is a boolean indicating if the
|
|
265
|
-
proof was successful (i.e. returns value of 0) and whose second element
|
|
266
|
-
is the output of the prover.
|
|
267
|
-
"""
|
|
268
|
-
if not assumptions:
|
|
269
|
-
assumptions = []
|
|
270
|
-
|
|
271
|
-
stdout, returncode = self._call_prover9(self.prover9_input(goal, assumptions),
|
|
272
|
-
verbose=verbose)
|
|
273
|
-
return (returncode == 0, stdout)
|
|
274
|
-
|
|
275
|
-
def prover9_input(self, goal, assumptions):
|
|
276
|
-
"""
|
|
277
|
-
:see: Prover9Parent.prover9_input
|
|
278
|
-
"""
|
|
279
|
-
s = 'clear(auto_denials).\n' #only one proof required
|
|
280
|
-
return s + Prover9Parent.prover9_input(self, goal, assumptions)
|
|
281
|
-
|
|
282
|
-
def _call_prover9(self, input_str, args=[], verbose=False):
|
|
283
|
-
"""
|
|
284
|
-
Call the ``prover9`` binary with the given input.
|
|
285
|
-
|
|
286
|
-
:param input_str: A string whose contents are used as stdin.
|
|
287
|
-
:param args: A list of command-line arguments.
|
|
288
|
-
:return: A tuple (stdout, returncode)
|
|
289
|
-
:see: ``config_prover9``
|
|
290
|
-
"""
|
|
291
|
-
if self._prover9_bin is None:
|
|
292
|
-
self._prover9_bin = self._find_binary('prover9', verbose)
|
|
293
|
-
|
|
294
|
-
updated_input_str = ''
|
|
295
|
-
if self._timeout > 0:
|
|
296
|
-
updated_input_str += 'assign(max_seconds, %d).\n\n' % self._timeout
|
|
297
|
-
updated_input_str += input_str
|
|
298
|
-
|
|
299
|
-
stdout, returncode = self._call(updated_input_str, self._prover9_bin, args, verbose)
|
|
300
|
-
|
|
301
|
-
if returncode not in [0,2]:
|
|
302
|
-
errormsgprefix = '%%ERROR:'
|
|
303
|
-
if errormsgprefix in stdout:
|
|
304
|
-
msgstart = stdout.index(errormsgprefix)
|
|
305
|
-
errormsg = stdout[msgstart:].strip()
|
|
306
|
-
else:
|
|
307
|
-
errormsg = None
|
|
308
|
-
if returncode in [3,4,5,6]:
|
|
309
|
-
raise Prover9LimitExceededException(returncode, errormsg)
|
|
310
|
-
else:
|
|
311
|
-
raise Prover9FatalException(returncode, errormsg)
|
|
312
|
-
|
|
313
|
-
return stdout, returncode
|
|
314
|
-
|
|
315
|
-
def _call_prooftrans(self, input_str, args=[], verbose=False):
|
|
316
|
-
"""
|
|
317
|
-
Call the ``prooftrans`` binary with the given input.
|
|
318
|
-
|
|
319
|
-
:param input_str: A string whose contents are used as stdin.
|
|
320
|
-
:param args: A list of command-line arguments.
|
|
321
|
-
:return: A tuple (stdout, returncode)
|
|
322
|
-
:see: ``config_prover9``
|
|
323
|
-
"""
|
|
324
|
-
if self._prooftrans_bin is None:
|
|
325
|
-
self._prooftrans_bin = self._find_binary('prooftrans', verbose)
|
|
326
|
-
|
|
327
|
-
return self._call(input_str, self._prooftrans_bin, args, verbose)
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
class Prover9Exception(Exception):
|
|
331
|
-
def __init__(self, returncode, message):
|
|
332
|
-
msg = p9_return_codes[returncode]
|
|
333
|
-
if message:
|
|
334
|
-
msg += '\n%s' % message
|
|
335
|
-
Exception.__init__(self, msg)
|
|
336
|
-
|
|
337
|
-
class Prover9FatalException(Prover9Exception):
|
|
338
|
-
pass
|
|
339
|
-
|
|
340
|
-
class Prover9LimitExceededException(Prover9Exception):
|
|
341
|
-
pass
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
######################################################################
|
|
346
|
-
#{ Tests and Demos
|
|
347
|
-
######################################################################
|
|
348
|
-
|
|
349
|
-
def test_config():
|
|
350
|
-
|
|
351
|
-
a = Expression.fromstring('(walk(j) & sing(j))')
|
|
352
|
-
g = Expression.fromstring('walk(j)')
|
|
353
|
-
p = Prover9Command(g, assumptions=[a])
|
|
354
|
-
p._executable_path = None
|
|
355
|
-
p.prover9_search=[]
|
|
356
|
-
p.prove()
|
|
357
|
-
#config_prover9('/usr/local/bin')
|
|
358
|
-
print(p.prove())
|
|
359
|
-
print(p.proof())
|
|
360
|
-
|
|
361
|
-
def test_convert_to_prover9(expr):
|
|
362
|
-
"""
|
|
363
|
-
Test that parsing works OK.
|
|
364
|
-
"""
|
|
365
|
-
for t in expr:
|
|
366
|
-
e = Expression.fromstring(t)
|
|
367
|
-
print(convert_to_prover9(e))
|
|
368
|
-
|
|
369
|
-
def test_prove(arguments):
|
|
370
|
-
"""
|
|
371
|
-
Try some proofs and exhibit the results.
|
|
372
|
-
"""
|
|
373
|
-
for (goal, assumptions) in arguments:
|
|
374
|
-
g = Expression.fromstring(goal)
|
|
375
|
-
alist = [Expression.fromstring(a) for a in assumptions]
|
|
376
|
-
p = Prover9Command(g, assumptions=alist).prove()
|
|
377
|
-
for a in alist:
|
|
378
|
-
print(' %s' % a)
|
|
379
|
-
print('|- %s: %s\n' % (g, p))
|
|
380
|
-
|
|
381
|
-
arguments = [
|
|
382
|
-
('(man(x) <-> (not (not man(x))))', []),
|
|
383
|
-
('(not (man(x) & (not man(x))))', []),
|
|
384
|
-
('(man(x) | (not man(x)))', []),
|
|
385
|
-
('(man(x) & (not man(x)))', []),
|
|
386
|
-
('(man(x) -> man(x))', []),
|
|
387
|
-
('(not (man(x) & (not man(x))))', []),
|
|
388
|
-
('(man(x) | (not man(x)))', []),
|
|
389
|
-
('(man(x) -> man(x))', []),
|
|
390
|
-
('(man(x) <-> man(x))', []),
|
|
391
|
-
('(not (man(x) <-> (not man(x))))', []),
|
|
392
|
-
('mortal(Socrates)', ['all x.(man(x) -> mortal(x))', 'man(Socrates)']),
|
|
393
|
-
('((all x.(man(x) -> walks(x)) & man(Socrates)) -> some y.walks(y))', []),
|
|
394
|
-
('(all x.man(x) -> all x.man(x))', []),
|
|
395
|
-
('some x.all y.sees(x,y)', []),
|
|
396
|
-
('some e3.(walk(e3) & subj(e3, mary))',
|
|
397
|
-
['some e1.(see(e1) & subj(e1, john) & some e2.(pred(e1, e2) & walk(e2) & subj(e2, mary)))']),
|
|
398
|
-
('some x e1.(see(e1) & subj(e1, x) & some e2.(pred(e1, e2) & walk(e2) & subj(e2, mary)))',
|
|
399
|
-
['some e1.(see(e1) & subj(e1, john) & some e2.(pred(e1, e2) & walk(e2) & subj(e2, mary)))'])
|
|
400
|
-
]
|
|
401
|
-
|
|
402
|
-
expressions = [r'some x y.sees(x,y)',
|
|
403
|
-
r'some x.(man(x) & walks(x))',
|
|
404
|
-
r'\x.(man(x) & walks(x))',
|
|
405
|
-
r'\x y.sees(x,y)',
|
|
406
|
-
r'walks(john)',
|
|
407
|
-
r'\x.big(x, \y.mouse(y))',
|
|
408
|
-
r'(walks(x) & (runs(x) & (threes(x) & fours(x))))',
|
|
409
|
-
r'(walks(x) -> runs(x))',
|
|
410
|
-
r'some x.(PRO(x) & sees(John, x))',
|
|
411
|
-
r'some x.(man(x) & (not walks(x)))',
|
|
412
|
-
r'all x.(man(x) -> walks(x))']
|
|
413
|
-
|
|
414
|
-
def spacer(num=45):
|
|
415
|
-
print('-' * num)
|
|
416
|
-
|
|
417
|
-
def demo():
|
|
418
|
-
print("Testing configuration")
|
|
419
|
-
spacer()
|
|
420
|
-
test_config()
|
|
421
|
-
print()
|
|
422
|
-
print("Testing conversion to Prover9 format")
|
|
423
|
-
spacer()
|
|
424
|
-
test_convert_to_prover9(expressions)
|
|
425
|
-
print()
|
|
426
|
-
print("Testing proofs")
|
|
427
|
-
spacer()
|
|
428
|
-
test_prove(arguments)
|
|
429
|
-
|
|
430
|
-
if __name__ == '__main__':
|
|
431
|
-
demo()
|
|
1
|
+
# Natural Language Toolkit: Interface to the Prover9 Theorem Prover
|
|
2
|
+
#
|
|
3
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
4
|
+
# Author: Dan Garrette <dhgarrette@gmail.com>
|
|
5
|
+
# Ewan Klein <ewan@inf.ed.ac.uk>
|
|
6
|
+
#
|
|
7
|
+
# URL: <http://nltk.org/>
|
|
8
|
+
# For license information, see LICENSE.TXT
|
|
9
|
+
"""
|
|
10
|
+
A theorem prover that makes use of the external 'Prover9' package.
|
|
11
|
+
"""
|
|
12
|
+
from __future__ import print_function
|
|
13
|
+
|
|
14
|
+
import os
|
|
15
|
+
import subprocess
|
|
16
|
+
|
|
17
|
+
import nltk
|
|
18
|
+
from nltk.sem.logic import Expression, ExistsExpression, AllExpression, \
|
|
19
|
+
NegatedExpression, AndExpression, IffExpression, OrExpression, \
|
|
20
|
+
EqualityExpression, ImpExpression
|
|
21
|
+
from nltk.inference.api import BaseProverCommand, Prover
|
|
22
|
+
|
|
23
|
+
#
|
|
24
|
+
# Following is not yet used. Return code for 2 actually realized as 512.
|
|
25
|
+
#
|
|
26
|
+
p9_return_codes = {
|
|
27
|
+
0: True,
|
|
28
|
+
1: "(FATAL)", #A fatal error occurred (user's syntax error).
|
|
29
|
+
2: False, # (SOS_EMPTY) Prover9 ran out of things to do
|
|
30
|
+
# (sos list exhausted).
|
|
31
|
+
3: "(MAX_MEGS)", # The max_megs (memory limit) parameter was exceeded.
|
|
32
|
+
4: "(MAX_SECONDS)", # The max_seconds parameter was exceeded.
|
|
33
|
+
5: "(MAX_GIVEN)", # The max_given parameter was exceeded.
|
|
34
|
+
6: "(MAX_KEPT)", # The max_kept parameter was exceeded.
|
|
35
|
+
7: "(ACTION)", # A Prover9 action terminated the search.
|
|
36
|
+
101: "(SIGSEGV)", # Prover9 crashed, most probably due to a bug.
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class Prover9CommandParent(object):
|
|
41
|
+
"""
|
|
42
|
+
A common base class used by both ``Prover9Command`` and ``MaceCommand``,
|
|
43
|
+
which is responsible for maintaining a goal and a set of assumptions,
|
|
44
|
+
and generating prover9-style input files from them.
|
|
45
|
+
"""
|
|
46
|
+
def print_assumptions(self, output_format='nltk'):
|
|
47
|
+
"""
|
|
48
|
+
Print the list of the current assumptions.
|
|
49
|
+
"""
|
|
50
|
+
if output_format.lower() == 'nltk':
|
|
51
|
+
for a in self.assumptions():
|
|
52
|
+
print(a)
|
|
53
|
+
elif output_format.lower() == 'prover9':
|
|
54
|
+
for a in convert_to_prover9(self.assumptions()):
|
|
55
|
+
print(a)
|
|
56
|
+
else:
|
|
57
|
+
raise NameError("Unrecognized value for 'output_format': %s" %
|
|
58
|
+
output_format)
|
|
59
|
+
|
|
60
|
+
class Prover9Command(Prover9CommandParent, BaseProverCommand):
|
|
61
|
+
"""
|
|
62
|
+
A ``ProverCommand`` specific to the ``Prover9`` prover. It contains
|
|
63
|
+
the a print_assumptions() method that is used to print the list
|
|
64
|
+
of assumptions in multiple formats.
|
|
65
|
+
"""
|
|
66
|
+
def __init__(self, goal=None, assumptions=None, timeout=60, prover=None):
|
|
67
|
+
"""
|
|
68
|
+
:param goal: Input expression to prove
|
|
69
|
+
:type goal: sem.Expression
|
|
70
|
+
:param assumptions: Input expressions to use as assumptions in
|
|
71
|
+
the proof.
|
|
72
|
+
:type assumptions: list(sem.Expression)
|
|
73
|
+
:param timeout: number of seconds before timeout; set to 0 for
|
|
74
|
+
no timeout.
|
|
75
|
+
:type timeout: int
|
|
76
|
+
:param prover: a prover. If not set, one will be created.
|
|
77
|
+
:type prover: Prover9
|
|
78
|
+
"""
|
|
79
|
+
if not assumptions:
|
|
80
|
+
assumptions = []
|
|
81
|
+
|
|
82
|
+
if prover is not None:
|
|
83
|
+
assert isinstance(prover, Prover9)
|
|
84
|
+
else:
|
|
85
|
+
prover = Prover9(timeout)
|
|
86
|
+
|
|
87
|
+
BaseProverCommand.__init__(self, prover, goal, assumptions)
|
|
88
|
+
|
|
89
|
+
def decorate_proof(self, proof_string, simplify=True):
|
|
90
|
+
"""
|
|
91
|
+
:see BaseProverCommand.decorate_proof()
|
|
92
|
+
"""
|
|
93
|
+
if simplify:
|
|
94
|
+
return self._prover._call_prooftrans(proof_string, ['striplabels'])[0].rstrip()
|
|
95
|
+
else:
|
|
96
|
+
return proof_string.rstrip()
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class Prover9Parent(object):
|
|
100
|
+
"""
|
|
101
|
+
A common class extended by both ``Prover9`` and ``Mace <mace.Mace>``.
|
|
102
|
+
It contains the functionality required to convert NLTK-style
|
|
103
|
+
expressions into Prover9-style expressions.
|
|
104
|
+
"""
|
|
105
|
+
|
|
106
|
+
_binary_location = None
|
|
107
|
+
|
|
108
|
+
def config_prover9(self, binary_location, verbose=False):
|
|
109
|
+
if binary_location is None:
|
|
110
|
+
self._binary_location = None
|
|
111
|
+
self._prover9_bin = None
|
|
112
|
+
else:
|
|
113
|
+
name = 'prover9'
|
|
114
|
+
self._prover9_bin = nltk.internals.find_binary(
|
|
115
|
+
name,
|
|
116
|
+
path_to_bin=binary_location,
|
|
117
|
+
env_vars=['PROVER9'],
|
|
118
|
+
url='http://www.cs.unm.edu/~mccune/prover9/',
|
|
119
|
+
binary_names=[name, name + '.exe'],
|
|
120
|
+
verbose=verbose)
|
|
121
|
+
self._binary_location = self._prover9_bin.rsplit(os.path.sep, 1)
|
|
122
|
+
|
|
123
|
+
def prover9_input(self, goal, assumptions):
|
|
124
|
+
"""
|
|
125
|
+
:return: The input string that should be provided to the
|
|
126
|
+
prover9 binary. This string is formed based on the goal,
|
|
127
|
+
assumptions, and timeout value of this object.
|
|
128
|
+
"""
|
|
129
|
+
s = ''
|
|
130
|
+
|
|
131
|
+
if assumptions:
|
|
132
|
+
s += 'formulas(assumptions).\n'
|
|
133
|
+
for p9_assumption in convert_to_prover9(assumptions):
|
|
134
|
+
s += ' %s.\n' % p9_assumption
|
|
135
|
+
s += 'end_of_list.\n\n'
|
|
136
|
+
|
|
137
|
+
if goal:
|
|
138
|
+
s += 'formulas(goals).\n'
|
|
139
|
+
s += ' %s.\n' % convert_to_prover9(goal)
|
|
140
|
+
s += 'end_of_list.\n\n'
|
|
141
|
+
|
|
142
|
+
return s
|
|
143
|
+
|
|
144
|
+
def binary_locations(self):
|
|
145
|
+
"""
|
|
146
|
+
A list of directories that should be searched for the prover9
|
|
147
|
+
executables. This list is used by ``config_prover9`` when searching
|
|
148
|
+
for the prover9 executables.
|
|
149
|
+
"""
|
|
150
|
+
return ['/usr/local/bin/prover9',
|
|
151
|
+
'/usr/local/bin/prover9/bin',
|
|
152
|
+
'/usr/local/bin',
|
|
153
|
+
'/usr/bin',
|
|
154
|
+
'/usr/local/prover9',
|
|
155
|
+
'/usr/local/share/prover9']
|
|
156
|
+
|
|
157
|
+
def _find_binary(self, name, verbose=False):
|
|
158
|
+
binary_locations = self.binary_locations()
|
|
159
|
+
if self._binary_location is not None:
|
|
160
|
+
binary_locations += [self._binary_location]
|
|
161
|
+
return nltk.internals.find_binary(name,
|
|
162
|
+
searchpath=binary_locations,
|
|
163
|
+
env_vars=['PROVER9'],
|
|
164
|
+
url='http://www.cs.unm.edu/~mccune/prover9/',
|
|
165
|
+
binary_names=[name, name + '.exe'],
|
|
166
|
+
verbose=verbose)
|
|
167
|
+
|
|
168
|
+
def _call(self, input_str, binary, args=[], verbose=False):
|
|
169
|
+
"""
|
|
170
|
+
Call the binary with the given input.
|
|
171
|
+
|
|
172
|
+
:param input_str: A string whose contents are used as stdin.
|
|
173
|
+
:param binary: The location of the binary to call
|
|
174
|
+
:param args: A list of command-line arguments.
|
|
175
|
+
:return: A tuple (stdout, returncode)
|
|
176
|
+
:see: ``config_prover9``
|
|
177
|
+
"""
|
|
178
|
+
if verbose:
|
|
179
|
+
print('Calling:', binary)
|
|
180
|
+
print('Args:', args)
|
|
181
|
+
print('Input:\n', input_str, '\n')
|
|
182
|
+
|
|
183
|
+
# Call prover9 via a subprocess
|
|
184
|
+
cmd = [binary] + args
|
|
185
|
+
try:
|
|
186
|
+
input_str = input_str.encode("utf8")
|
|
187
|
+
except AttributeError:
|
|
188
|
+
pass
|
|
189
|
+
p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
|
|
190
|
+
stderr=subprocess.STDOUT,
|
|
191
|
+
stdin=subprocess.PIPE)
|
|
192
|
+
(stdout, stderr) = p.communicate(input=input_str)
|
|
193
|
+
|
|
194
|
+
if verbose:
|
|
195
|
+
print('Return code:', p.returncode)
|
|
196
|
+
if stdout: print('stdout:\n', stdout, '\n')
|
|
197
|
+
if stderr: print('stderr:\n', stderr, '\n')
|
|
198
|
+
|
|
199
|
+
return (stdout.decode("utf-8"), p.returncode)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def convert_to_prover9(input):
|
|
203
|
+
"""
|
|
204
|
+
Convert a ``logic.Expression`` to Prover9 format.
|
|
205
|
+
"""
|
|
206
|
+
if isinstance(input, list):
|
|
207
|
+
result = []
|
|
208
|
+
for s in input:
|
|
209
|
+
try:
|
|
210
|
+
result.append(_convert_to_prover9(s.simplify()))
|
|
211
|
+
except:
|
|
212
|
+
print('input %s cannot be converted to Prover9 input syntax' % input)
|
|
213
|
+
raise
|
|
214
|
+
return result
|
|
215
|
+
else:
|
|
216
|
+
try:
|
|
217
|
+
return _convert_to_prover9(input.simplify())
|
|
218
|
+
except:
|
|
219
|
+
print('input %s cannot be converted to Prover9 input syntax' % input)
|
|
220
|
+
raise
|
|
221
|
+
|
|
222
|
+
def _convert_to_prover9(expression):
|
|
223
|
+
"""
|
|
224
|
+
Convert ``logic.Expression`` to Prover9 formatted string.
|
|
225
|
+
"""
|
|
226
|
+
if isinstance(expression, ExistsExpression):
|
|
227
|
+
return 'exists ' + str(expression.variable) + ' ' + _convert_to_prover9(expression.term)
|
|
228
|
+
elif isinstance(expression, AllExpression):
|
|
229
|
+
return 'all ' + str(expression.variable) + ' ' + _convert_to_prover9(expression.term)
|
|
230
|
+
elif isinstance(expression, NegatedExpression):
|
|
231
|
+
return '-(' + _convert_to_prover9(expression.term) + ')'
|
|
232
|
+
elif isinstance(expression, AndExpression):
|
|
233
|
+
return '(' + _convert_to_prover9(expression.first) + ' & ' + \
|
|
234
|
+
_convert_to_prover9(expression.second) + ')'
|
|
235
|
+
elif isinstance(expression, OrExpression):
|
|
236
|
+
return '(' + _convert_to_prover9(expression.first) + ' | ' + \
|
|
237
|
+
_convert_to_prover9(expression.second) + ')'
|
|
238
|
+
elif isinstance(expression, ImpExpression):
|
|
239
|
+
return '(' + _convert_to_prover9(expression.first) + ' -> ' + \
|
|
240
|
+
_convert_to_prover9(expression.second) + ')'
|
|
241
|
+
elif isinstance(expression, IffExpression):
|
|
242
|
+
return '(' + _convert_to_prover9(expression.first) + ' <-> ' + \
|
|
243
|
+
_convert_to_prover9(expression.second) + ')'
|
|
244
|
+
elif isinstance(expression, EqualityExpression):
|
|
245
|
+
return '(' + _convert_to_prover9(expression.first) + ' = ' + \
|
|
246
|
+
_convert_to_prover9(expression.second) + ')'
|
|
247
|
+
else:
|
|
248
|
+
return str(expression)
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
class Prover9(Prover9Parent, Prover):
|
|
252
|
+
_prover9_bin = None
|
|
253
|
+
_prooftrans_bin = None
|
|
254
|
+
|
|
255
|
+
def __init__(self, timeout=60):
|
|
256
|
+
self._timeout = timeout
|
|
257
|
+
"""The timeout value for prover9. If a proof can not be found
|
|
258
|
+
in this amount of time, then prover9 will return false.
|
|
259
|
+
(Use 0 for no timeout.)"""
|
|
260
|
+
|
|
261
|
+
def _prove(self, goal=None, assumptions=None, verbose=False):
|
|
262
|
+
"""
|
|
263
|
+
Use Prover9 to prove a theorem.
|
|
264
|
+
:return: A pair whose first element is a boolean indicating if the
|
|
265
|
+
proof was successful (i.e. returns value of 0) and whose second element
|
|
266
|
+
is the output of the prover.
|
|
267
|
+
"""
|
|
268
|
+
if not assumptions:
|
|
269
|
+
assumptions = []
|
|
270
|
+
|
|
271
|
+
stdout, returncode = self._call_prover9(self.prover9_input(goal, assumptions),
|
|
272
|
+
verbose=verbose)
|
|
273
|
+
return (returncode == 0, stdout)
|
|
274
|
+
|
|
275
|
+
def prover9_input(self, goal, assumptions):
|
|
276
|
+
"""
|
|
277
|
+
:see: Prover9Parent.prover9_input
|
|
278
|
+
"""
|
|
279
|
+
s = 'clear(auto_denials).\n' #only one proof required
|
|
280
|
+
return s + Prover9Parent.prover9_input(self, goal, assumptions)
|
|
281
|
+
|
|
282
|
+
def _call_prover9(self, input_str, args=[], verbose=False):
|
|
283
|
+
"""
|
|
284
|
+
Call the ``prover9`` binary with the given input.
|
|
285
|
+
|
|
286
|
+
:param input_str: A string whose contents are used as stdin.
|
|
287
|
+
:param args: A list of command-line arguments.
|
|
288
|
+
:return: A tuple (stdout, returncode)
|
|
289
|
+
:see: ``config_prover9``
|
|
290
|
+
"""
|
|
291
|
+
if self._prover9_bin is None:
|
|
292
|
+
self._prover9_bin = self._find_binary('prover9', verbose)
|
|
293
|
+
|
|
294
|
+
updated_input_str = ''
|
|
295
|
+
if self._timeout > 0:
|
|
296
|
+
updated_input_str += 'assign(max_seconds, %d).\n\n' % self._timeout
|
|
297
|
+
updated_input_str += input_str
|
|
298
|
+
|
|
299
|
+
stdout, returncode = self._call(updated_input_str, self._prover9_bin, args, verbose)
|
|
300
|
+
|
|
301
|
+
if returncode not in [0,2]:
|
|
302
|
+
errormsgprefix = '%%ERROR:'
|
|
303
|
+
if errormsgprefix in stdout:
|
|
304
|
+
msgstart = stdout.index(errormsgprefix)
|
|
305
|
+
errormsg = stdout[msgstart:].strip()
|
|
306
|
+
else:
|
|
307
|
+
errormsg = None
|
|
308
|
+
if returncode in [3,4,5,6]:
|
|
309
|
+
raise Prover9LimitExceededException(returncode, errormsg)
|
|
310
|
+
else:
|
|
311
|
+
raise Prover9FatalException(returncode, errormsg)
|
|
312
|
+
|
|
313
|
+
return stdout, returncode
|
|
314
|
+
|
|
315
|
+
def _call_prooftrans(self, input_str, args=[], verbose=False):
|
|
316
|
+
"""
|
|
317
|
+
Call the ``prooftrans`` binary with the given input.
|
|
318
|
+
|
|
319
|
+
:param input_str: A string whose contents are used as stdin.
|
|
320
|
+
:param args: A list of command-line arguments.
|
|
321
|
+
:return: A tuple (stdout, returncode)
|
|
322
|
+
:see: ``config_prover9``
|
|
323
|
+
"""
|
|
324
|
+
if self._prooftrans_bin is None:
|
|
325
|
+
self._prooftrans_bin = self._find_binary('prooftrans', verbose)
|
|
326
|
+
|
|
327
|
+
return self._call(input_str, self._prooftrans_bin, args, verbose)
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
class Prover9Exception(Exception):
|
|
331
|
+
def __init__(self, returncode, message):
|
|
332
|
+
msg = p9_return_codes[returncode]
|
|
333
|
+
if message:
|
|
334
|
+
msg += '\n%s' % message
|
|
335
|
+
Exception.__init__(self, msg)
|
|
336
|
+
|
|
337
|
+
class Prover9FatalException(Prover9Exception):
|
|
338
|
+
pass
|
|
339
|
+
|
|
340
|
+
class Prover9LimitExceededException(Prover9Exception):
|
|
341
|
+
pass
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
######################################################################
|
|
346
|
+
#{ Tests and Demos
|
|
347
|
+
######################################################################
|
|
348
|
+
|
|
349
|
+
def test_config():
|
|
350
|
+
|
|
351
|
+
a = Expression.fromstring('(walk(j) & sing(j))')
|
|
352
|
+
g = Expression.fromstring('walk(j)')
|
|
353
|
+
p = Prover9Command(g, assumptions=[a])
|
|
354
|
+
p._executable_path = None
|
|
355
|
+
p.prover9_search=[]
|
|
356
|
+
p.prove()
|
|
357
|
+
#config_prover9('/usr/local/bin')
|
|
358
|
+
print(p.prove())
|
|
359
|
+
print(p.proof())
|
|
360
|
+
|
|
361
|
+
def test_convert_to_prover9(expr):
|
|
362
|
+
"""
|
|
363
|
+
Test that parsing works OK.
|
|
364
|
+
"""
|
|
365
|
+
for t in expr:
|
|
366
|
+
e = Expression.fromstring(t)
|
|
367
|
+
print(convert_to_prover9(e))
|
|
368
|
+
|
|
369
|
+
def test_prove(arguments):
|
|
370
|
+
"""
|
|
371
|
+
Try some proofs and exhibit the results.
|
|
372
|
+
"""
|
|
373
|
+
for (goal, assumptions) in arguments:
|
|
374
|
+
g = Expression.fromstring(goal)
|
|
375
|
+
alist = [Expression.fromstring(a) for a in assumptions]
|
|
376
|
+
p = Prover9Command(g, assumptions=alist).prove()
|
|
377
|
+
for a in alist:
|
|
378
|
+
print(' %s' % a)
|
|
379
|
+
print('|- %s: %s\n' % (g, p))
|
|
380
|
+
|
|
381
|
+
arguments = [
|
|
382
|
+
('(man(x) <-> (not (not man(x))))', []),
|
|
383
|
+
('(not (man(x) & (not man(x))))', []),
|
|
384
|
+
('(man(x) | (not man(x)))', []),
|
|
385
|
+
('(man(x) & (not man(x)))', []),
|
|
386
|
+
('(man(x) -> man(x))', []),
|
|
387
|
+
('(not (man(x) & (not man(x))))', []),
|
|
388
|
+
('(man(x) | (not man(x)))', []),
|
|
389
|
+
('(man(x) -> man(x))', []),
|
|
390
|
+
('(man(x) <-> man(x))', []),
|
|
391
|
+
('(not (man(x) <-> (not man(x))))', []),
|
|
392
|
+
('mortal(Socrates)', ['all x.(man(x) -> mortal(x))', 'man(Socrates)']),
|
|
393
|
+
('((all x.(man(x) -> walks(x)) & man(Socrates)) -> some y.walks(y))', []),
|
|
394
|
+
('(all x.man(x) -> all x.man(x))', []),
|
|
395
|
+
('some x.all y.sees(x,y)', []),
|
|
396
|
+
('some e3.(walk(e3) & subj(e3, mary))',
|
|
397
|
+
['some e1.(see(e1) & subj(e1, john) & some e2.(pred(e1, e2) & walk(e2) & subj(e2, mary)))']),
|
|
398
|
+
('some x e1.(see(e1) & subj(e1, x) & some e2.(pred(e1, e2) & walk(e2) & subj(e2, mary)))',
|
|
399
|
+
['some e1.(see(e1) & subj(e1, john) & some e2.(pred(e1, e2) & walk(e2) & subj(e2, mary)))'])
|
|
400
|
+
]
|
|
401
|
+
|
|
402
|
+
expressions = [r'some x y.sees(x,y)',
|
|
403
|
+
r'some x.(man(x) & walks(x))',
|
|
404
|
+
r'\x.(man(x) & walks(x))',
|
|
405
|
+
r'\x y.sees(x,y)',
|
|
406
|
+
r'walks(john)',
|
|
407
|
+
r'\x.big(x, \y.mouse(y))',
|
|
408
|
+
r'(walks(x) & (runs(x) & (threes(x) & fours(x))))',
|
|
409
|
+
r'(walks(x) -> runs(x))',
|
|
410
|
+
r'some x.(PRO(x) & sees(John, x))',
|
|
411
|
+
r'some x.(man(x) & (not walks(x)))',
|
|
412
|
+
r'all x.(man(x) -> walks(x))']
|
|
413
|
+
|
|
414
|
+
def spacer(num=45):
|
|
415
|
+
print('-' * num)
|
|
416
|
+
|
|
417
|
+
def demo():
|
|
418
|
+
print("Testing configuration")
|
|
419
|
+
spacer()
|
|
420
|
+
test_config()
|
|
421
|
+
print()
|
|
422
|
+
print("Testing conversion to Prover9 format")
|
|
423
|
+
spacer()
|
|
424
|
+
test_convert_to_prover9(expressions)
|
|
425
|
+
print()
|
|
426
|
+
print("Testing proofs")
|
|
427
|
+
spacer()
|
|
428
|
+
test_prove(arguments)
|
|
429
|
+
|
|
430
|
+
if __name__ == '__main__':
|
|
431
|
+
demo()
|