>>> from nltk.sem.glue import * >>> nltk.sem.logic._counter._value = 0
>>> from nltk.parse.malt import MaltParser>>> tagger = RegexpTagger( ... [('^(John|Mary)$', 'NNP'), ... ('^(sees|chases)$', 'VB'), ... ('^(a)$', 'ex_quant'), ... ('^(every)$', 'univ_quant'), ... ('^(girl|dog)$', 'NN') ... ]) >>> depparser = MaltParser(tagger=tagger)
>>> glue = Glue(depparser=depparser) >>> readings = glue.parse_to_meaning('every girl chases a dog'.split()) >>> for reading in sorted([r.simplify().normalize() for r in readings], key=str): ... print(reading.normalize()) all z1.(girl(z1) -> exists z2.(dog(z2) & chases(z1,z2))) exists z1.(dog(z1) & all z2.(girl(z2) -> chases(z2,z1)))>>> drtglue = DrtGlue(depparser=depparser) >>> readings = drtglue.parse_to_meaning('every girl chases a dog'.split()) >>> for reading in sorted([r.simplify().normalize() for r in readings], key=str): ... print(reading) ([],[(([z1],[girl(z1)]) -> ([z2],[dog(z2), chases(z1,z2)]))]) ([z1],[dog(z1), (([z2],[girl(z2)]) -> ([],[chases(z2,z1)]))])
Checking for equality of two DRSs is very useful when generating readings of a sentence. For example, the glue module generates two readings for the sentence John sees Mary:
>>> from nltk.sem.glue import DrtGlue >>> readings = drtglue.parse_to_meaning('John sees Mary'.split()) >>> for drs in sorted([r.simplify().normalize() for r in readings], key=str): ... print(drs) ([z1,z2],[John(z1), Mary(z2), sees(z1,z2)]) ([z1,z2],[Mary(z1), John(z2), sees(z2,z1)])
However, it is easy to tell that these two readings are logically the same, and therefore one of them is superfluous. We can use the theorem prover to determine this equivalence, and then delete one of them. A particular theorem prover may be specified, or the argument may be left off to use the default.
>>> readings[0].equiv(readings[1]) True