Sztuczna Inteligencja - Prolog 3

54
Operatory Operacjy wyj´ scia/wej´ scia Predykaty wbudowane Techniki programowania Postscriptum Sztuczna Inteligencja i Systemy Ekspertowe Prolog 3 Aleksander Pohl http://apohllo.pl/dydaktyka/ai Wy˙ zsza Szkola Zarz ˛ adzania i Bankowo´ sci 23 marca 2009 Aleksander Pohl WSZiB Prolog 3

Transcript of Sztuczna Inteligencja - Prolog 3

Page 1: 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

Page 2: Sztuczna Inteligencja - 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

Page 3: Sztuczna Inteligencja - 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

Page 4: Sztuczna Inteligencja - 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

Page 5: Sztuczna Inteligencja - 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

Page 6: Sztuczna Inteligencja - 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

Page 7: Sztuczna Inteligencja - 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

Page 8: Sztuczna Inteligencja - 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

Page 9: Sztuczna Inteligencja - 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

Page 10: Sztuczna Inteligencja - 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

Page 11: Sztuczna Inteligencja - 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

Page 12: Sztuczna Inteligencja - 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

Page 13: Sztuczna Inteligencja - 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

Page 14: Sztuczna Inteligencja - 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

Page 15: Sztuczna Inteligencja - 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

Page 16: Sztuczna Inteligencja - 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

Page 17: Sztuczna Inteligencja - 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

Page 18: Sztuczna Inteligencja - 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

Page 19: Sztuczna Inteligencja - 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

Page 20: Sztuczna Inteligencja - 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

Page 21: Sztuczna Inteligencja - 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

Page 22: Sztuczna Inteligencja - 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

Page 23: Sztuczna Inteligencja - 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

Page 24: Sztuczna Inteligencja - 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

Page 25: Sztuczna Inteligencja - 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

Page 26: Sztuczna Inteligencja - 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

Page 27: Sztuczna Inteligencja - 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

Page 28: Sztuczna Inteligencja - 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

Page 29: Sztuczna Inteligencja - 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

Page 30: Sztuczna Inteligencja - 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

Page 31: Sztuczna Inteligencja - 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

Page 32: Sztuczna Inteligencja - 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

Page 33: Sztuczna Inteligencja - 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

Page 34: Sztuczna Inteligencja - 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

Page 35: Sztuczna Inteligencja - 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

Page 36: Sztuczna Inteligencja - 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

Page 37: Sztuczna Inteligencja - 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

Page 38: Sztuczna Inteligencja - 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

Page 39: Sztuczna Inteligencja - 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

Page 40: Sztuczna Inteligencja - 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

Page 41: Sztuczna Inteligencja - 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

Page 42: Sztuczna Inteligencja - 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

Page 43: Sztuczna Inteligencja - 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

Page 44: Sztuczna Inteligencja - 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

Page 45: Sztuczna Inteligencja - 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

Page 46: Sztuczna Inteligencja - 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

Page 47: Sztuczna Inteligencja - 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

Page 48: Sztuczna Inteligencja - 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

Page 49: Sztuczna Inteligencja - 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

Page 50: Sztuczna Inteligencja - 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

Page 51: Sztuczna Inteligencja - 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

Page 52: Sztuczna Inteligencja - 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

Page 53: Sztuczna Inteligencja - 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

Page 54: Sztuczna Inteligencja - Prolog 3

Operatory Operacjy wyjscia/wejscia Predykaty wbudowane Techniki programowania Postscriptum

Dziekuje!

Aleksander Pohl WSZiB

Prolog 3