Systemy
automatyczne
go
wnioskowania
Projekt
Grupa: 2
Sekcja: 2
Łukasz Heince
Paweł Wyrwas
Historia
„
Kradzież ciasta”
Podczas ostatniego policyjnego dochodzenia, Główny Inspektor
Stone przesłuchiwał pięciu lokalnych przestępców w celu
zidentyfikowania, kto ukradł ciasto Pani Kowalskiej z jarmarku
świętojańskiego. Poniżej znajduje się podsumowanie ich zeznań:
1) Arek: to nie był Edek, to był Bolek.
2)Bolek: to nie był Czarek, to nie był Edek .
3)Czarek: to był Edek, to nie był Arek.
4)Darek: to był Czarek, to był Bolek.
5)Edek: to był Darek, to nie był Arek.
Było wiadome, że każdy z podejrzanych powiedział dokładnie
jedno kłamstwo. Napisz program, który wskaże kto ukradł
ciasto.
Analiza wypowiedzi
• Arek:
Kłamstwo: „to był Bolek”
Prawda: „to nie był Edek”
• Bolek:
Kłamstwo: „to nie był Czarek”
Prawda: „to nie był Edek”
Analiza wypowiedzi
cd.
• Czarek:
Kłamstwo: „to był Edek”
Prawda: „to nie był Arek”
• Darek:
Kłamstwo: „to był Bolek”
Prawda: „to był Czarek”
• Edek:
Kłamstwo: „to był Darek”
Prawda: „to nie był Arek”
Analiza w prologu
tw1(Imie,0):-Imie="Edek",Imie="Bolek".
tw1(Imie,1):-Imie<>"Edek",Imie<>"Bolek".
tw2(Imie,0):-Imie="Czarek",Imie<>"Edek".
tw2(Imie,1):-Imie<>"Czarek",Imie="Edek".
tw3(Imie,0):-Imie<>"Edek",Imie<>"Arek".
tw3(Imie,1):-Imie="Edek",Imie="Arek".
tw4(Imie,0):-Imie<>"Czarek",Imie="Bolek".
tw4(Imie,1):-Imie="Czarek",Imie<>"Bolek".
tw5(Imie,0):-Imie<>"Darek",Imie<>"Arek".
tw5(Imie,1):-Imie="Darek",Imie="Arek".
Kod programu
domains
Lista=Integer*
predicates
nondeterm varia_rep(Integer, Lista, Lista);
nondeterm delete(Integer,Lista,Lista)
tw1(String,Integer)
tw2(String,Integer)
tw3(String,Integer)
tw4(String,Integer)
tw5(String,Integer)
nondeterm element(Lista, Integer, Integer)
nondeterm main(String)
nondeterm sprawdz(String,Lista)
nondeterm osoba(String)
print(Lista)
goal
main(Imie).
Kod programu cd.
clauses
main(Imie):-write("Zestawienie prawd i klamstw. 1 - pierwsza czesc wypowiedzi jest
prawdziwa, 0 - druga czesc wypowiedzi jest prawdziwa"),nl, osoba(Imie),
varia_rep(5, [0, 1], List),
sprawdz(Imie, List), print(List),nl,write("Zlodziejem jest: "),nl.
% lista osob
osoba("Arek"). osoba("Bolek"). osoba("Czarek"). osoba("Darek"). osoba("Edek").
% Wariacja z potwótrzeniami
varia_rep(0,_,[]).
varia_rep(N,L,[H|RVaria]) :- N>0, N1 = N-1, delete(H,L,_), varia_rep(N1,L,RVaria).
delete(X, [X|Xs], Xs).
delete(X, [Y|Ys], [Y|Rs]) :- delete(X, Ys, Rs).
element([H|_], 0, H).
element([_|T], N, Wynik) :- NN = N - 1, element(T, NN, Wynik).
Kod programu cd.2
sprawdz(Imie,Perm):-
element(Perm,0,Wartosc1),tw1(Imie,Wartosc1),
element(Perm,1,Wartosc2),tw2(Imie,Wartosc2),
element(Perm,2,Wartosc3),tw3(Imie,Wartosc3),
element(Perm,3,Wartosc4),tw4(Imie,Wartosc4),
element(Perm,4,Wartosc5),tw5(Imie,Wartosc5).
-
%warunki : 0 gdy druga cześć jest prawdziwa ,1 gdy pierwsza cześć jest prawdziwa
tw1(Imie,0):-Imie="Edek",Imie="Bolek".
tw1(Imie,1):-Imie<>"Edek",Imie<>"Bolek".
tw2(Imie,0):-Imie="Czarek",Imie<>"Edek".
tw2(Imie,1):-Imie<>"Czarek",Imie="Edek".
tw3(Imie,0):-Imie<>"Edek",Imie<>"Arek".
tw3(Imie,1):-Imie="Edek",Imie="Arek".
tw4(Imie,0):-Imie<>"Czarek",Imie="Bolek".
tw4(Imie,1):-Imie="Czarek",Imie<>"Bolek".
tw5(Imie,0):-Imie<>"Darek",Imie<>"Arek".
tw5(Imie,1):-Imie="Darek",Imie="Arek".
print([]).
print([H|T]) :- write(H, " "), print(T).
Dziękujemy !