Sztuczna Inteligencja - Prolog 3
-
Upload
aleksander-pohl -
Category
Education
-
view
2.190 -
download
2
Transcript of Sztuczna Inteligencja - Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Sztuczna Inteligencja i Systemy EkspertoweProlog 3
Aleksander Pohlhttp://apohllo.pl/dydaktyka/ai
Wyzsza Szkoła Zarzadzania i Bankowosci
23 marca 2009
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Plan prezentacji
Operatory
Operacjy wyjscia/wejscia
Predykaty wbudowane
Techniki programowania
Postscriptum
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Plan prezentacji
Operatory
Operacjy wyjscia/wejscia
Predykaty wbudowane
Techniki programowania
Postscriptum
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Typy operatorów
◮ infiksowenp. 5 + 10, a ∨ b
◮ prefiksowenp. - 5, ¬ a
◮ postfiksowenp. 5, 6 + (notacja Łukasiewicza)
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Dyrektywy
◮ op(N,T,Name).◮ N – liczbowa wartosc priorytetu operatora◮ T – typ operatora◮ Name– nazwa atomu
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Priorytety
Im nizszy wartosc priorytetu (im wyzszy priorytet), tym operatorwiaze silniej.
◮ term, badz wyrazenie w nawiasach: 0◮ priorytet struktury: priorytet funktora głównego◮ x – wartosc priorytetu silnie mniejsza od wartosci
priorytetu operatora głównego◮ y – wartosc priorytetu mniejsza badz równa wartosci
priorytetowi operatora głównego
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Typy operatorów
◮ infiksowexfx , xfy , yfx
◮ prefiksowefx , fy
◮ postfiksowexf , yf
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Przykład
◮ a-b-c
◮ (a-b)-c – tradycyjna interpretacja◮ definiujemy jako yfx
a-b priorytet równy wartosci operatora, czyli y ma takisam priorytet jak operator główny
◮ definiujemy jako xfy (błednie)a-b priorytet równy wartosci operatora, ale x nie mozemiec priorytetu takiego jak operator główny
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Przykład
not
◮ jako fxnot(not p)
◮ jako fynot not p
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Predefiniowane operatory
◮ op(1200,xfx,[ :- , -> ] )
◮ op(1100,xfy,’;’)
◮ op(1000,xfy,’,’)
◮ op(900,fy, not )
◮ op(700,xfx,[ is,=, \=,=:=,= \= ])
◮ op(500,yfx,[ +,- ])
◮ op(400,yfx,[ * ,/,//,mod ])
◮ op(200, xfx , ** )
◮ op(200,fy,-)
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Przykład (1)
◮ ¬(A ∨ B) ↔ ¬A ∨ ¬B◮ equiv(not( and(A,B)),or(not(A),not(B)))
◮ op( 800,xfx, <===>).
◮ op(700,xfy,v).
◮ op(600,xfy,&).
◮ op(500,fy, ∼).
◮ ∼(A & B) <===> ∼A v ∼B.
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Przykład (2)
◮ op(300,xfx, plays).
◮ op(200,xfy,and).
◮ jimmy plays football and squash.
◮ Who plays football and squash.
◮ Who = jimmy
◮ jimmy plays What.
◮ What = football and squash
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Plan prezentacji
Operatory
Operacjy wyjscia/wejscia
Predykaty wbudowane
Techniki programowania
Postscriptum
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Wstep
◮ Wejscie inne niz w formie pytan logincznych (np. w jezykunaturalnym)
◮ Formatowanie wyjscia◮ Współpraca z innymi urzadzeniami peryferyjnymi niz
terminal◮ Dwa otwarte strumienie:
◮ biezacy strumien wejsciwy◮ biezacy strumien wyjsciowy◮ domyslnie – terminal user
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Operacje na wejsciu i wyjsciu
◮ see – zamiana aktualnego wejscia na inne:◮ see(file1)◮ read_from_file(Info)◮ see(user)
◮ tell – zamiana aktualnego wyjscia na inne
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Operacje na wejsciu i wyjsciu
◮ Zamykanie strumieni:◮ seen◮ told
◮ end_of_file – koniec pliku◮ get , put – pojedyncze znaki◮ read , write – termy
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Operacje na wejsciu
◮ read(X) – odczyt termu z biezacego strumienia wejscia◮ X zmienna – podstawienie wartosci◮ brak dopasowania – fail
◮ nie ma nawrotu w celu przeczytania nastepnego elementu
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Operacje na wyjsciu
◮ write(X) – zapis termu do biezacego strumienia wyjscia◮ tab(N) – wypisanie N spacji◮ nl – przejscie do nowej linii
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Schemat przetwarzania pliku
◮ processfile :- read(Term),process(Term).
◮ process(end_of_file) :- !.
◮ process(Term) :-treat(Term), processfile.
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Przetwarzanie pliku – przykład błedny!
◮ cube :- read(stop), !.
◮ cube :- read(N),C is N * N* N,write(C),cube.
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Przetwarzanie pliku – przykład poprawny
◮ cube :-write(’Next Item, please:’),read(X),process(X).
◮ process(stop) :- !.
◮ process(N) :- C is N * N* N,write(’Cube of ’), write(N),write(’ is ’),write(C),nl,cube.
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Wczytywanie i wypisywanie znaków
◮ put(C) – wypisanie pojedynczego znaku◮ get(C) – wczytanie pojedynczego, widocznego znaku
(nie-spacji)◮ get0(C) – wczytanie pojedynczego znaku
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Przykład – operacje na znakach
◮ squeeze :-get0(C), put(C), dorest(C).
◮ dorest(46) :- !. %46 ASCII „.”
◮ dorest(32) :- !, get(C), put(C),dorest(C). %32 ASCII „ ”
◮ dorest(Letter) :- squeeze.
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Operacje na znakach
◮ name(A, L) – zamiana termu na kody znaków◮ name(zx232, [ 122, 120, 50, 51, 50 ])
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Wczytywanie plików
◮ consult(F)
◮ compile(F)
◮ consult([file1, file2, queens])
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Plan prezentacji
Operatory
Operacjy wyjscia/wejscia
Predykaty wbudowane
Techniki programowania
Postscriptum
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Testowanie typu
◮ var(X) – zmienna o wartosci nieprzypisanej◮ nonvar(X)
◮ atom(X) – wartosc atomowa◮ integer(X) – liczba całkowita◮ float(X) – liczba zmiennopozycyjna◮ number(X) – liczba◮ atomic(X) – liczba lub wartosc atomowa◮ compound(X) – struktura
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Testowanie typu – przykład (1)
◮ count(_,[],0).
◮ count(A,[A|L],N) :- !,count(A,L,N1),N is N1 +1.
◮ count(A,[_|L],N) :- count(A,L,N).
◮ count(a,[a,b,a,a],Nb).
◮ Nb=3
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Testowanie typu – przykład (2)
◮ count1(_,[],0).
◮ count1(A,[B|L],N) :-atom(B),A=B,!,count1(A,L,N1),N is N1 +1 ;count1(A,L,N).
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Testowanie typu – przykład (3)
◮ count(a,[a,b,X,Y],Nb).Nb=3
◮ count1(a,[a,b,X,Y],Nb).Nb=1
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Predykat =..
◮ Term =.. L
◮ f(a,b) =.. L
◮ L=[f,a,b]
◮ T=..[rectangle,4,5]
◮ T=rectangle(4,5)
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Predykat =.. – przykład (1)
◮ enlarge(Type(Par),F,Type(Par1)) :-Par1 is Par * F.
◮ square(side), triangle(s1,s2,s3),rectangle(s1,s2)
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Predykat =.. – przykład (2)
◮ enlarge(Fig,F,Fig1) :-Fig=..[Type,Params],multiply_list(Params,F,Params1),Fig1=..[Type,Params1].
◮ multiply_list([],_,[]).
◮ multiply_list( [X|L],F,[X1|L1]) :-X1 is X * F, multiply_list(L,F,L1).
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
arg i functor
◮ functor(D,date,3).
◮ D=date(_5,_6,_7).
◮ arg(1,D,29)
◮ arg(2,D,june)
◮ arg(3,D,1982)
◮ D = date(29,june,1982).
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Porównywanie termów
◮ X=Y – równosc termów◮ X is E – ewaluacja wartosci liczbowej◮ X=:=Y – równosc wartosci liczbowych◮ X=/=Y – nierównosc wartosci liczbowych◮ T1==T2 – identycznosc termów◮ T1/==T2 – nieidentycznosc termów◮ X@<Y– porównywanie słownikowe◮ @<, @<=, @>=, @>
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Zarzadzanie asercjami
◮ assert(X) – dodanie asercji◮ retract(X) – usuniecie asercji◮ asserta(X) – dodanie asercji na poczatku◮ assertz(X) – dodanie asercji na koncu
◮ assert(rodzic(jan, anna))
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Plan prezentacji
Operatory
Operacjy wyjscia/wejscia
Predykaty wbudowane
Techniki programowania
Postscriptum
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Caching
◮ solve(problem1, Solution),asserta(solve(problem1,Solution)).
◮ fib(1,1):- !.
◮ fib(2,1):- !.
◮ fib(N,M) :-N1 is N-1, fib(N1,M1),N2 is N-2, fib(N2,M2),M is M1 + M2,asserta(fib(N,M)).
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Sterowanie
◮ ! – odciecie◮ fail – cel, który zawsze konczy sie niepowodzeniem◮ true – cel, który zawsze konczy sie sukcesem◮ not(P) – negacja (przez odciecie!)◮ call(P) – wywołanie procedury◮ repeat – potwórzenie:
◮ repeat.◮ repeat:-repeat.
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Powtórzenie – przykład
◮ doSquare :-repeat,read(X),(X = stop, ! ;Y is X * X, write(Y), fail).
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Zbieranie wyników
◮ bagof(X,P,L) – L lista obiektów X spełniajacychpredykat P
◮ setof(X,P,L) – L posortowana lista obiektówX spełniajacych predykat P
◮ findall(X,P,L) – podobny do bagof , z ta róznica, zedla wyniku istotna jest tylko zmienna X
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
bagof – przykład (1)
◮ age(peter,7).
◮ age(ann,5).
◮ age(pat,8).
◮ age(tom,5).
◮ bagof(C,age(C,5),L).
◮ L=[ann,tom]
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
bagof – przykład (2)
◮ bagof(C,age(C,A),L).
◮ A=7, L=[peter]
◮ A=5, L=[ann,tom]
◮ A=8, L=[pat]
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
bagof, setof, findall – przykład
◮ bagof(C,A ^age(C,A),L).L=[peter, ann , pat, tom]
◮ setof(C,A ^age(C,A),ChildList).ChildList = [ ann, pat, peter , tom ]
◮ setof(A,C ^age(C,A),AgeList).AgeList = [ 5,7,8 ]
◮ findall(C,age(C,A),L).L=[peter, ann , pat, tom]
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Optymalizacja ostatniego wywołania
◮ p(...) :- ....
◮ p(...) :- ....
◮ P(...) :- ...., !, p(...).
◮ Zmiana rekursji na iteracje
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Akumulator – problem małpy
◮ canget(state(_,_,_,has),[]).
◮ canget(State1,[Move| L]) :-print(Move), write(’ ’),move( State1, Move, State2),canget( State2, L ).
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Wykorzystanie akumulatora
Brak tail recursion:◮ sumlist([],0).
◮ sumlist([First|Rest],Sum) :-sumlist(Rest,Sum0), Sum is X + Sum0.
Wykorzystanie tail recursion:◮ sumlist(L,S) :- sumlist(L,0,S).
◮ sumlist([],S,S).
◮ sumlist([First|Rest],PartialSum,TotalSum):-NewPartialSum is PartialSum + First,sumlist(Rest, NewPartialSum, TotalSum).
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Tablice
◮ functor(A, f, 100).
◮ A = f(_,_,_,....,_)
◮ arg(60,f,1).
◮ W jezyku C: f[60]=1
◮ arg(60,f,X).
◮ W jezyku C: X=f[60]
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Listy róznicowe (1)
◮ conc([], L, L).
◮ conc([X|L1],L2,[X|L3]):-conc(L1,L2,L3).
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Listy róznicowe (2)
◮ [a,b,c] → [a,b,c|T]-T
◮ [] → L-L
◮ conc(A1-Z1,Z1-Z2,A1-Z2).
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Listy róznicowe (3)
◮ ... czyli conc(L1,L2,L3).
◮ ?- conc([a,b,c|T1]-T1,[d,e|T2]-T2,L).
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Plan prezentacji
Operatory
Operacjy wyjscia/wejscia
Predykaty wbudowane
Techniki programowania
Postscriptum
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Materiały zródłowe
◮ L.Sterling, E.Shapiro - „The Art Of Prolog”◮ Ivan Bratko - „Prolog – Programming For Artificial
Intelligence”◮ Slajdy zostały przygotowane za zgoda
dr. Michała Korzyckiego na podstawie jego wykładu.
Aleksander Pohl WSZiB
Prolog 3
Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum
Dziekuje!
Aleksander Pohl WSZiB
Prolog 3