# Domaine du restaurant (reutilise de SL-1)
ATTRIBUTES = [
"Alternate", "Bar", "Fri/Sat", "Hungry",
"Patrons", "Price", "Raining", "Reservation",
"Type", "WaitEstimate"
]
# Les 12 exemples du restaurant, adaptes de la Table 19.1 d'AIMA.
# Comme en SL-1, les labels de X2 et X3 sont inverses par rapport au livre :
# ainsi AUCUNE clause de Horn unique n'est consistante (meme Patrons=Some a un
# contre-exemple), ce qui est exactement le scenario que l'oracle doit detecter.
RAW_EXAMPLES = [
("Yes", "No", "No", "Yes", "Some", "$$$", "No", "Yes", "French", "0-10", True),
("Yes", "No", "No", "Yes", "Full", "$", "No", "No", "Thai", "30-60", True),
("No", "Yes", "No", "No", "Some", "$", "No", "No", "Burger", "0-10", False),
("Yes", "No", "Yes", "Yes", "Full", "$", "Yes", "No", "Thai", "10-30", True),
("Yes", "No", "Yes", "No", "Full", "$$$", "No", "Yes", "French", ">60", False),
("No", "Yes", "No", "Yes", "Some", "$$", "Yes", "Yes", "Italian","0-10", True),
("No", "Yes", "No", "No", "None", "$", "Yes", "No", "Burger", "0-10", False),
("No", "No", "No", "Yes", "Some", "$$", "Yes", "Yes", "Thai", "0-10", True),
("No", "Yes", "Yes", "No", "Full", "$", "Yes", "No", "Burger", "10-30", False),
("Yes", "Yes", "Yes", "Yes", "Full", "$$$", "No", "Yes", "Italian","10-30", False),
("No", "No", "No", "No", "None", "$", "No", "No", "Thai", "0-10", False),
("Yes", "Yes", "Yes", "Yes", "Full", "$", "No", "No", "Burger", "30-60", True),
]
def parse_example(raw: tuple) -> dict:
"""Convertit un tuple brut en dictionnaire avec attributs + label."""
attrs = {ATTRIBUTES[i]: raw[i] for i in range(len(ATTRIBUTES))}
attrs["WillWait"] = raw[len(ATTRIBUTES)]
return attrs
EXAMPLES = [parse_example(ex) for ex in RAW_EXAMPLES]
POSITIVES = [e for e in EXAMPLES if e["WillWait"]]
NEGATIVES = [e for e in EXAMPLES if not e["WillWait"]]
print(f"Domaine : {len(ATTRIBUTES)} attributs")
print(f"Exemples : {len(EXAMPLES)} ({len(POSITIVES)} positifs, {len(NEGATIVES)} negatifs)")
print()
print("Exemples positifs :")
for e in POSITIVES:
print(f" Patrons={e['Patrons']:5s} Hungry={e['Hungry']:3s} Fri/Sat={e['Fri/Sat']:3s} Type={e['Type']:8s}")