Toggle navigation
?
users online
Logout
Open hangout
Open chat for current file
:- discontiguous valuta_corrispondenza/5. :- discontiguous guida/5. /*------------------------------------------------------------------*/ % ESERCIZI % Es1. Avendo a disposizione la testimonianza di % Enjolras e gli indizi 1, 2 e 3, si può dedurre che % il malvivente con il giubbotto rosso è Valjean? % FALSE % Es2. Avendo a disposizione la testimonianza di % Enjolras e gli indizi 1, 2, 3 e 4, (senza considerare % le prove a difesa) si può dedurre che il malvivente con % il giubbotto rosso è Valjean? % TRUE % Es3. Come Es2, ma in questo caso va considerata anche % la prova a difesa: si può dedurre che il malvivente con % il giubbotto rosso è Valjean? % FALSE % Es. 4. Avendo a disposizione la testimonianza di % Enjolras e gli indizi 1, 2, 3 e 5 si può dedurre che % il malvivente con il giubbotto rosso è Valjean? % TRUE /*------------------------------------------------------------------*/ /* FATTI SUI VALJEAN */ nato( data(1980,10,17,13,07), valjean, 'reggio calabria' ). possiede( data(0,0,0,0,0), data(2100,0,0,0,0), valjean, impronta_digitale(9876) ). /* FATTI SUI TESTIMONI */ affidabilita(enjolras, alta). affidabilita(fantine, alta). affidabilita(thenardier, alta). /* IL FATTO STORICO */ si_trova( data(2020,05,12,14,45), data(2020,05,12,15,00), malviventeGiubbottoRosso, carrefour_via_bianchi_genova, testimone(enjolras) ). indossa( data(2020,05,12,14,45), data(2020,05,12,15,00), malviventeGiubbottoRosso, guanti, testimone(enjolras) ). indossa( data(2020,05,12,14,45), data(2020,05,12,15,00), malviventeGiubbottoRosso, casco, testimone(enjolras) ). utilizza( data(2020,05,12,14,45), data(2020,05,12,15,00), malviventeGiubbottoRosso, pistola, testimone(enjolras) ). compie( data(2020,05,12,14,45), data(2020,05,12,15,00), malviventeGiubbottoRosso, rapina, testimone(enjolras) ). /* INDIZIO 1 */ guida( data(2020,05,12,15,00), data(2020,05,12,15,05), malviventeGiubbottoRosso, veicolo(motorino,12345), testimone(fantine) ). rinviene( data(2020,05,12,18,00), data(2020,05,12,18,05), jerome, via_rossi_genova, veicolo(motorino,12345) ). /* INDIZIO 2 */ denuncia( data(2020,05,11,8,00), data(2020,05,11,8,30), marius, scomparsa, veicolo(motorino,12345) ). rinviene( data(2020,05,13,18,00), cosette, veicolo( motorino, 12345, specchietto_retrovisore), impronta_digitale(9877) ). valuta_corrispondenza( data(2020,05,14,9,00), gavroche, impronta_digitale(9876), impronta_digitale(9877), 99 ). /* INDIZIO 3 */ pronuncia( data(2020,05,12,15,01), data(2020,05,12,15,30), malviventeGiubbottoRosso, 'jamunindi jamunindi', testimone(fantine) ). valuta_origine_lingua( data(2020,05,14,10,00), eponine, 'jamunindi jamunindi', 'reggio calabria', 100). /* INDIZIO 4 */ guida( data(2020,05,12,15,03), data(2020,05,12,15,04), valjean, veicolo(motorino,12345), testimone(thenardier) ). /* INDIZIO 5 */ /* valuta_corrispondenza( data(2020,05,14,10,00), gavroche, tracce_audio(malviventeGiubbottoRosso), tracce_audio(valjean), 99 ). */ /* Deduzioni logiche */ ha_guidato_prima_di( Data2, X, veicolo(motorino,Targa), Confidenza) :- possiede(_, _, X, impronta_digitale(CodiceImpronta1)), rinviene(Data2, _, veicolo(motorino,Targa,specchietto_retrovisore), impronta_digitale(CodiceImpronta2)), valuta_corrispondenza( _, _, impronta_digitale(CodiceImpronta1), impronta_digitale(CodiceImpronta2), Confidenza). conosce_una_frase_nella_lingua_di( X, Luogo, Confidenza, testimone(T)) :- pronuncia(_, _, X, Frase, testimone(T)), affidabilita(T, alta), valuta_origine_lingua(_, _, Frase, Luogo, Confidenza). /* Indizi deducibili sull'essere la stessa persona */ indizio_stessa_persona( conosce_una_frase_e_nato_in(Luogo, testimone_affidabile(T)), X, Y, gravita(bassa), precisione(bassa) ) :- conosce_una_frase_nella_lingua_di( X, Luogo, Confidenza, testimone(T)), Confidenza > 98, nato(_, Y, Luogo), X \= Y. indizio_stessa_persona( corrispondenza_tracce_audio(Data, Perito, Confidenza), X, Y, gravita(alta), precisione(alta) ) :- valuta_corrispondenza( Data, Perito, tracce_audio(X), tracce_audio(Y), Confidenza), Confidenza > 98, X \= Y. indizio_stessa_persona( rilevate_impronte_digitali_compatibili_su(V,Targa, testimone_affidabile(T)), X, Y, gravita(alta), precisione(bassa) ) :- guida( _, IstanteFine, X, veicolo(V,Targa), testimone(T)), affidabilita(T, alta), ha_guidato_prima_di( IstantePerizia, Y, veicolo(V,Targa), Confidenza ), differenza_date( IstantePerizia, IstanteFine, Differenza), Confidenza > 98, Differenza > 0, X \= Y. indizio_stessa_persona( stesso_veicolo_in_momenti_contigui(veicolo(V, Targa, testimoni_affidabili(MinT, MaxT))), X, Y, gravita(alta), precisione(alta) ) :- guida( _, DataFine1, X, veicolo(V, Targa), testimone(T1)), affidabilita(T1, alta), guida( DataInizio2, _, Y, veicolo(V, Targa), testimone(T2)), affidabilita(T2, alta), differenza_date(DataInizio2, DataFine1, Differenza), Differenza < 1, minStr(T1, T2, MinT), maxStr(T1, T2 ,MaxT), X \= Y. stessa_persona(Motivo, X, Y, G, P) :- (indizio_stessa_persona(Motivo, X, Y, G, P); indizio_stessa_persona(Motivo, Y, X, G, P)). /* Il codice di procedura penale prevede che le prove critiche (che il codice chiama indizi in quanto sono fatti noti che indicano un fatto ignoto) sono sufficienti per ritenere responsabile una persona di un fatto se sono gravi, precise e concordanti. L’uso del plurale evidenzia che gli indizi devono essere più di uno, di cui almeno uno grave e preciso, e gli altri concordanti. -- gravità, attiene al grado di convincimento: è grave l’indizio che è resistente alle obiezioni e quindi ha un’elevata persuasività e cioè un ampio grado di probabilità; -- precisione, non devono essere suscettibili di altre diverse interpretazioni; -- concordanza, devono convertire tutti verso la medesima conclusioni, non debbono esservi elementi contrastanti. */ sono_la_stessa_persona(X, Y, ListaDiMotivi) :- setof((Motivo, gravita(G), precisione(P)), stessa_persona( Motivo, X, Y, gravita(G), precisione(P)), ListaDiMotivi), length(ListaDiMotivi, L), L > 1, member((_, gravita(alta), precisione(alta)), ListaDiMotivi). ha_compiuto( Inizio, Fine, Y, rapina_a_mano_armata, Sito, Motivi ):- si_trova(Inizio, Fine, Y, Sito, testimone(T1)), affidabilita(T1, alta), indossa(Inizio, Fine, Y, casco, testimone(T2)), affidabilita(T2, alta), utilizza(Inizio, Fine, Y, pistola, testimone(T3)), affidabilita(T3, alta), compie(Inizio, Fine, Y, rapina, testimone(T4)), affidabilita(T4, alta), Motivi = [si_trova(Inizio, Fine, Y, Sito, testimone_affidabile(T1)), indossa(Inizio, Fine, Y, casco, testimone_affidabile(T2)), utilizza(Inizio, Fine, Y, pistola, testimone_affidabile(T3)), compie(Inizio, Fine, Y, rapina, testimone_affidabile(T4))]. responsabile(X) :- ha_compiuto(Inizio, _, Y, Crimine, Sito, Motivi1), sono_la_stessa_persona(X, Y, Motivi2), pretty_print(Inizio, X, Y, Crimine, Sito, Motivi1, Motivi2). /* Predicati di utilita' */ /* differenza tra due date espressa in minuti */ differenza_date( data(Anno1,Mese1,Giorno1,Ora1,Minuto1), data(Anno2,Mese2,Giorno2,Ora2,Minuto2), Differenza) :- Differenza is (Anno1-Anno2)*525600 + (Mese1-Mese2)*43200 + (Giorno1-Giorno2)*1440 + (Ora1-Ora2)*60 + (Minuto1-Minuto2). /* Minimo, massimo */ minStr(T1, T2, MinT) :- compare(<, T1, T2), MinT = T1, !. minStr(_, T2, T2). maxStr(T1, T2, MaxT) :- compare(>, T1, T2), MaxT = T1, !. maxStr(_, T2, T2). /* Stampa comprensibile a un utente */ pretty_print(Inizio, X, Y, Crimine, Sito, Motivi1, Motivi2) :- nl, write('SENTENZA:'), nl, write('MOTIVI DELLA DECISIONE '), nl, write(' Ritenuto che dalle prove acquisite emerge che '), nl, nl, pretty_print_list(Motivi1), write('Ritenuto pertanto che si identifica '), write(Y), write(' con il sig./sig.ra '), write(X), write(' per i seguenti indizi coerenti:'), nl, nl, pretty_print_list(Motivi2), write('PQM'), nl, write('In nome del Popolo Italiano'), nl, write('Il Tribunale di Genova, in composizione monocratica'), nl, write('Nella persona del giudice HAL 9000'),nl, write('Visti gli artt. 353, 355 c.p.p.'),nl,nl, write('DICHIARA'), nl, nl, write(X), write(' responsabile di tutti i reati a lui ascritti per avere compiuto '), write(Crimine), write(' in '), write(Inizio), write(' nel luogo '), write(Sito), nl, write('Riserva ad altra udienza la determinazione della pena.'), nl, nl. pretty_print_list([]):- nl, nl. pretty_print_list([H|T]):- write(H), nl, nl, pretty_print_list(T). /*----------------------------------------------------*/ /* Esercizietti di riscaldamento.... */ /* Alcuni semplici fatti */ mamma(viviana, samuele). mamma(viviana, simone). mamma(viviana, micol). maschio(samuele). maschio(simone). figlio_maschio(X, Y) :- mamma(Y, X), maschio(X). /*----------------------------------------------------*/