9.E Si consideri il seguente programma ASP. Determinare gli answer set, spiegando il procedimento seguito (attenzione alla rappresentazione del constraint in termini di ciclo). flies(X):- obj(X), not noflies(X). noflies(X):- obj(X), not flies(X). :- obj(X),flies(X), not bird(X). bird(a). dog(b). obj(a). obj(b). I fatti sono inclusi in ogni Answer Set. Si deve supporre di aver effettuato il grounding del programma. Il primo passo e' determinare gli Answer Set del ciclo pari. Essi sono: MP1 = {flies(a), flies(b)} MP2 = {noflies(a), noflies(b)} MP3 = {flies(a), noflies(b)} MP4 = {noflies(a), flies(b)} A questo punto occorre considerare il constraint, che va riscritto in termini di ciclo dispari come p:- not p, obj(X),flies(X), not bird(X). Esso stabilisce che, dato un oggetto, non puo' essere vero che esso e' un uccello e non vola. Formalmente, stabilisce che dato un oggetto, flies(X) e not bird(X) non possono essere simultaneamente veri, dove il not bird(X) va valutato sull'answer set candidato che si vuole considerare. Quindi il constraint e' violato quando per un oggetto, vale flies(X) e non vale bird(X) (cioe' vale anche not bird(X)). Il letterale not bird(X) vale per l'oggetto b, ossia vale not bird(b). A questo punto dobbiamo scartare gli answer set candidati dove vale flies(b), ossia MP1 ed MP4. Gli answer set del programma sono MP2 ed MP4 piu' i fatti, ossia M1 = {obj(a), obj(b), bird(a), dog(b), flies(a), noflies(b)} M2 = {obj(a), obj(b), bird(a), dog(b), noflies(a), noflies(b)} Notiamo che questo programma in merito agli uccelli e' "possibilista", ossia non dice tassativamente che volano, ma che "possono" volare.