Esercizio - Query Prolog con lookfor e islocated (esempio d'esame 1)
Teoria: Prolog - fatti, regole, ricorsione, liste e cutProlog come logica del primo ordine ristretta alle clausole di Horn: fatti, regole, query, motore di inferenza (backward chaining in profondità con backtracking, ordine delle clausole), termini, unificazione e occur check, aritmetica con is, ricorsione, liste e operatore barra, length e append, cut verde e rosso, cut e fail, negazione come fallimento.Prolog - fatti, regole, ricorsione, liste e cut → (anatomia di un programma, motore di inferenza, cut). Esercizio simile: Esercizio - Prolog - cut e negazione come fallimento (laboratorio 4). Domanda 5 del quiz da 9 CFU (Prolog non è nel programma da 6 CFU).
Testo. Dato il programma Prolog (figura):
lookfor(mary, book).
lookfor(john, keys).
lookfor(mary, eyeglasses).
lookfor(mary, lamp).
lookfor(john, lamp).
lookfor(john, cat).
islocated(book, shelf).
islocated(eyeglasses, table).
islocated(keys, keybox).
islocated(lamp, table).Scegliere le alternative corrette.
- Q1. In logica, cosa rappresenta
lookfor(mary, book).? Menu: una query / un fatto / una regola. - Q2. Output di
?- lookfor(john, Object), islocated(Object, Place).Menu: (a)Object = keys, Place = keybox; Object = lamp, Place = table; (b) le stesse due soluzioni piùObject = cat; (c) soloObject = keys, Place = keybox. - Q3. Output di
?- lookfor(mary, Object), !, islocated(Object, Place).Menu: (a)Object = eyeglasses, Place = table; (b)Object = book, Place = shelf; Object = eyeglasses, Place = table; Object = lamp, Place = table; (c)Object = book, Place = shelf. - Q4. Output di
?- lookfor(mary, keys). Menu: none / true / false.
Soluzione
Q1: un fatto. Una clausola senza corpo (testa.) è un fatto: afferma che è vero. Sarebbe una query solo se scritta all'interprete dopo il prompt ?-, e una regola solo se avesse un corpo (testa :- corpo.).
Q2: (a). Si risolvono i sottoobiettivi da sinistra a destra con backtracking. lookfor(john, Object) ha tre soluzioni in ordine:
keys:islocated(keys, Place)dàPlace = keybox. Prima soluzione.lamp:islocated(lamp, Place)dàPlace = table. Seconda soluzione.cat: non esiste nessun fattoislocated(cat, _), quindi il sottoobiettivo fallisce e questa strada non produce niente.
Perché (b) è sbagliata: cat compare in lookfor ma non soddisfa la congiunzione, perché non ha una posizione. Perché (c) è sbagliata: dopo la prima soluzione, premendo ; il motore torna indietro e trova anche lamp.
Q3: (c). Il cut ! dopo lookfor(mary, Object) cancella i punti di scelta creati finora: dopo che Object è stato unificato con la prima soluzione, book (la prima clausola lookfor(mary, ...) in ordine), lookfor non può più essere ritentato con eyeglasses o lamp. Poi islocated(book, Place) dà Place = shelf, e non ci sono altre clausole islocated(book, _). L'unica risposta è Object = book, Place = shelf.
- (b) è la risposta che si avrebbe senza cut:
book/shelf,eyeglasses/table,lamp/table(i tre oggetti di Mary, tutti con una posizione). - (a) prenderebbe la seconda soluzione di
lookfor, ma il cut impedisce di arrivarci: la prima è già stata fissata.
Q4: false. Nel programma non c'è lookfor(mary, keys) (l'unico keys è di John) e nessuna regola con testa lookfor: per l'ipotesi del mondo chiuso, ciò che non si può dimostrare è falso. L'interprete risponde false. (nelle versioni vecchie no). true sarebbe per un fatto presente; none non è un output di Prolog.
Verifica (simulazione in Python delle stesse liste): Q2 dà [(keys, keybox), (lamp, table)]; Q3 dà [(book, shelf)], mentre senza cut le soluzioni sono tre; ("mary","keys") non è tra i fatti.
Versione ripasso
- Q1:
lookfor(mary, book).nel programma è un fatto (niente corpo; non è una query né una regola). - Q2: sottoobiettivi da sinistra, backtracking. John cerca
keys,lamp,cat;catnon haislocated: soluzionikeys/keyboxelamp/table. - Q3: il cut fissa la prima soluzione di
lookfor(mary, Object),book: rispostaObject = book, Place = shelf(senza cut ce ne sarebbero tre). - Q4:
lookfor(mary, keys)non è derivabile:false(mondo chiuso).
Errori tipici: includere cat; ignorare l'effetto del cut; rispondere none.