% PRIMA SOLUZIONE connected(milano,bologna). connected(bologna,roma). holds(in(carico1,carrello1),s0). holds(at(carrello1,milano), s0). %Effetti azioni holds(in(Oggetto,Carrello),do(load(Oggetto,Carrello,Z),S)). holds(at(Carrello,Location2), do(drive(Carrello,Location1,Location2),S)). holds(at(Ogg,Location),do(unload(Ogg,Carrello,Location),S)). %Frame holds(V, do(load(Oggetto,Carrello,Location),S)):- holds(V,S), V\=at(Oggetto,Location). holds(V, do(unload(Oggetto,Carrello,Location),S)):- holds(V,S), V\= in(Oggetto,Carrello). holds(V, do(drive(Carrello,Location1,Location2),S)):- holds(V,S), V \= at(Carrello, Location1). % Precondizioni pact(load(Oggetto,Carrello,Location),S):- holds(at(Oggetto,Location),S), holds(at(Carrello,Location),S). pact(unload(Oggetto,Carrello,Location),S):- holds(in(Oggetto,Carrello),S), holds(at(Carrello,Location),S). pact(drive(Carrello,Location1,Location2),S):- connected(Location1,Location2), holds(at(Carrello,Location1),S). %Clausola per esprimere la raggiungibilità di uno stato: poss(s0). poss(do(U,S)):- poss(S), pact(U,S). GOAL :- poss(S), holds(at(carico1,roma),S). S = do( drive(carico1, bologna, roma), do(drive(carico1, milano, bologna), do(unload(carico1, carrello1, milano), s0))) si noti che l'azione drive che dovrebbe avere come primo parametro un carrello, ha invece un carico, poiche' l'unificazione tra la variabile Carrello (primo parametro di drive) e il termine carico1 ha successo. POSSIBILI SOLUZIONI 1) usare un termine per descrivere il tipo degli oggetti 2) usare predicati aggiuntivi 1) Usiamo i termini connected(milano,bologna). connected(bologna,roma). holds(in(oggetto(carico1),veicolo(carrello1)),s0). holds(at(veicolo(carrello1),milano), s0). %Effetti azioni holds(in(oggetto(Oggetto),veicolo(Carrello)),do(load(oggetto(Oggetto),veicolo(Carrello),Z),S)). holds(at(veicolo(Carrello),Location2), do(drive(veicolo(Carrello),Location1,Location2),S)). holds(at(Ogg,Location),do(unload(Ogg,veicolo(Carrello),Location),S)). %Frame holds(V, do(load(oggetto(Oggetto),veicolo(Carrello),Location),S)):- holds(V,S), V\=at(oggetto(Oggetto),Location). holds(V, do(unload(oggetto(Oggetto),veicolo(Carrello),Location),S)):- holds(V,S), V\= in(oggetto(Oggetto),veicolo(Carrello)). holds(V, do(drive(veicolo(Carrello),Location1,Location2),S)):- holds(V,S), V \= at(veicolo(Carrello), Location1). % Precondizioni pact(load(oggetto(Oggetto),veicolo(Carrello),Location),S):- holds(at(oggetto(Oggetto),Location),S), holds(at(veicolo(Carrello),Location),S). pact(unload(oggetto(Oggetto),veicolo(Carrello),Location),S):- holds(in(oggetto(Oggetto),veicolo(Carrello)),S), holds(at(veicolo(Carrello),Location),S). pact(drive(veicolo(Carrello),Location1,Location2),S):- connected(Location1,Location2), holds(at(veicolo(Carrello),Location1),S). %Clausola per esprimere la raggiungibilità di uno stato: poss(s0). poss(do(U,S)):- poss(S), pact(U,S). GOAL :- poss(S), holds(at(oggetto(carico1), roma), S). S = do(unload(oggetto(carico1), veicolo(carrello1), roma), do(drive(veicolo(carrello1), bologna, roma), do(drive(veicolo(carrello1), milano, bologna),s0))) 2) Soluzione con i predicati connected(milano,bologna). connected(bologna,roma). oggetto(carico1). veicolo(carrello1). holds(in(carico1,carrello1),s0). holds(at(carrello1,milano), s0). %Effetti azioni holds(in(Oggetto,Carrello),do(load(Oggetto,Carrello,Z),S)). holds(at(Carrello,Location2), do(drive(Carrello,Location1,Location2),S)). holds(at(Ogg,Location),do(unload(Ogg,Carrello,Location),S)). %Frame holds(V, do(load(Oggetto,Carrello,Location),S)):- holds(V,S), V\=at(Oggetto,Location). holds(V, do(unload(Oggetto,Carrello,Location),S)):- holds(V,S), V\= in(Oggetto,Carrello). holds(V, do(drive(Carrello,Location1,Location2),S)):- holds(V,S), V \= at(Carrello, Location1). % Precondizioni pact(load(Oggetto,Carrello,Location),S):- oggetto(Oggetto), veicolo(Carrello), holds(at(Oggetto,Location),S), holds(at(Carrello,Location),S). pact(unload(Oggetto,Carrello,Location),S):- oggetto(Oggetto), veicolo(Carrello), holds(in(Oggetto,Carrello),S), holds(at(Carrello,Location),S). pact(drive(Carrello,Location1,Location2),S):- veicolo(Carrello), connected(Location1,Location2), holds(at(Carrello,Location1),S). %Clausola per esprimere la raggiungibilità di uno stato: poss(s0). poss(do(U,S)):- poss(S), pact(U,S). GOAL :- poss(S), holds(at(carico1,roma),S). S = do(unload(carico1, carrello1, roma), do(drive(carrello1, bologna, roma), do(drive(carrello1, milano, bologna),s0)))