# -*- coding:utf-8 -*-

import nltk, sys
from nltk.sem import logic

# On déclare la valuation : c'est la déclaration des individus (entités) et des prédicats du modèle.
# On peut l'écrire sous forme d'une chaine de caractères

v = """
 TBON => TBON
 Fred => Fred
 Anne => Anne
 contrôleur => {Fred}
 passager => {Anne}
 insulte => {(Anne, Fred)}
"""

# On convertit la valuation d'une chaine de caractères en une forme traitable par nltk
val = nltk.sem.parse_valuation(v)

# On établit le domaine : ensemble des individus (entités)
dom = val.domain

# On instancie le modèle
m = nltk.sem.Model(dom, val)
g = nltk.sem.Assignment(dom)

# On évalue des formules (tous les opérateurs et quantificateurs sont donnés dans les exemples)
print >> sys.stdout, "Anne insulte Fred.", m.evaluate('insulte(Anne,Fred)', g)
print >> sys.stdout, "Anne insulte Fred ou Fred insulte Anne.", m.evaluate('insulte(Anne,Fred) | insulte(Fred,Anne)', g)
print >> sys.stdout, "Tous les passagers insultent Fred.", m.evaluate('all x.(passager(x) -> insulte(x, Fred))', g)
print >> sys.stdout, "Au moins un passager insulte Fred.", m.evaluate('some x.(passager(x) & insulte(x, Fred))', g)
print >> sys.stdout, "Aucun passager n'insulte Fred (1).", m.evaluate('- some x.(passager(x) & insulte(x,Fred))', g)
print >> sys.stdout, "Aucun passager n'insulte Fred (2).", m.evaluate('all x.(passager(x) -> - insulte(x,Fred))', g)
