Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Sztuczna Inteligencja - Prolog 3
1. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Sztuczna Inteligencja i Systemy Ekspertowe
Prolog 3
Aleksander Pohl
http://apohllo.pl/dydaktyka/ai
Wy˙ sza Szkoła Zarzadzania i Bankowo´ ci
z ˛ s
23 marca 2009
Aleksander Pohl WSZiB
Prolog 3
2. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Plan prezentacji
Operatory
Operacjy wyj´ cia/wej´ cia
s s
Predykaty wbudowane
Techniki programowania
Postscriptum
Aleksander Pohl WSZiB
Prolog 3
3. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Plan prezentacji
Operatory
Operacjy wyj´ cia/wej´ cia
s s
Predykaty wbudowane
Techniki programowania
Postscriptum
Aleksander Pohl WSZiB
Prolog 3
4. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Typy operatorów
infiksowe
◮
np. 5 + 10, a ∨ b
prefiksowe
◮
np. - 5, ¬ a
postfiksowe
◮
np. 5, 6 + (notacja Łukasiewicza)
Aleksander Pohl WSZiB
Prolog 3
5. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Dyrektywy
op(N,T,Name).
◮
s´
N – liczbowa warto´ c priorytetu operatora
◮
T – typ operatora
◮
Name – nazwa atomu
◮
Aleksander Pohl WSZiB
Prolog 3
6. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Priorytety
s´
Im ni˙ szy warto´ c priorytetu (im wy˙ szy priorytet), tym operator
z z
wia˙ e silniej.
˛z
term, bad´ wyra˙ enie w nawiasach: 0
˛z z
◮
priorytet struktury: priorytet funktora głównego
◮
s´
x – warto´ c priorytetu silnie mniejsza od warto´ ci
s
◮
priorytetu operatora głównego
s´
y – warto´ c priorytetu mniejsza bad´ równa warto´ ci
˛z s
◮
priorytetowi operatora głównego
Aleksander Pohl WSZiB
Prolog 3
7. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Typy operatorów
infiksowe
◮
xfx, xfy, yfx
prefiksowe
◮
fx, fy
postfiksowe
◮
xf, yf
Aleksander Pohl WSZiB
Prolog 3
8. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Przykład
a-b-c
◮
(a-b)-c – tradycyjna interpretacja
◮
definiujemy jako yfx
◮
a-b priorytet równy warto´ ci operatora, czyli y ma taki
s
sam priorytet jak operator główny
definiujemy jako xfy (błednie)
˛
◮
a-b priorytet równy warto´ ci operatora, ale x nie mo˙ e
s z
mie´ priorytetu takiego jak operator główny
c
Aleksander Pohl WSZiB
Prolog 3
9. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Przykład
not
jako fx
◮
not(not p)
jako fy
◮
not not p
Aleksander Pohl WSZiB
Prolog 3
10. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
11. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
12. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
13. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Plan prezentacji
Operatory
Operacjy wyj´ cia/wej´ cia
s s
Predykaty wbudowane
Techniki programowania
Postscriptum
Aleksander Pohl WSZiB
Prolog 3
14. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Wstep
˛
´
Wej´ cie inne ni˙ w formie pytan logincznych (np. w jezyku
s z ˛
◮
naturalnym)
Formatowanie wyj´ cia
s
◮
Współpraca z innymi urzadzeniami peryferyjnymi ni˙
˛ z
◮
terminal
Dwa otwarte strumienie:
◮
´
bie˙ acy strumien wej´ ciwy
˛z ˛ s
◮
´
bie˙ acy strumien wyj´ ciowy
z˛ s
◮
domy´ lnie – terminal user
s
◮
Aleksander Pohl WSZiB
Prolog 3
15. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Operacje na wej´ ciu i wyj´ ciu
s s
see – zamiana aktualnego wej´ cia na inne:
s
◮
see(file1)
◮
read_from_file(Info)
◮
see(user)
◮
tell – zamiana aktualnego wyj´ cia na inne
s
◮
Aleksander Pohl WSZiB
Prolog 3
16. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Operacje na wej´ ciu i wyj´ ciu
s s
Zamykanie strumieni:
◮
seen
◮
told
◮
end_of_file – koniec pliku
◮
get, put – pojedyncze znaki
◮
read, write – termy
◮
Aleksander Pohl WSZiB
Prolog 3
17. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Operacje na wej´ ciu
s
read(X) – odczyt termu z bie˙ acego strumienia wej´ cia
z˛ s
◮
X zmienna – podstawienie warto´ ci
s
◮
brak dopasowania – fail
◮
nie ma nawrotu w celu przeczytania nastepnego elementu
˛
◮
Aleksander Pohl WSZiB
Prolog 3
18. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Operacje na wyj´ ciu
s
write(X) – zapis termu do bie˙ acego strumienia wyj´ cia
z˛ s
◮
tab(N) – wypisanie N spacji
◮
nl – przej´ cie do nowej linii
s
◮
Aleksander Pohl WSZiB
Prolog 3
19. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
20. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
21. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
22. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
23. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
24. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
25. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Wczytywanie plików
consult(F)
◮
compile(F)
◮
consult([file1, file2, queens])
◮
Aleksander Pohl WSZiB
Prolog 3
26. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Plan prezentacji
Operatory
Operacjy wyj´ cia/wej´ cia
s s
Predykaty wbudowane
Techniki programowania
Postscriptum
Aleksander Pohl WSZiB
Prolog 3
27. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Testowanie typu
var(X) – zmienna o warto´ ci nieprzypisanej
s
◮
nonvar(X)
◮
s´
atom(X) – warto´ c atomowa
◮
integer(X) – liczba całkowita
◮
float(X) – liczba zmiennopozycyjna
◮
number(X) – liczba
◮
s´
atomic(X) – liczba lub warto´ c atomowa
◮
compound(X) – struktura
◮
Aleksander Pohl WSZiB
Prolog 3
28. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
29. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
30. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
31. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
32. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
33. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
34. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
35. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Porównywanie termów
s´
X=Y – równo´ c termów
◮
X is E – ewaluacja warto´ ci liczbowej
s
◮
s´
X=:=Y – równo´ c warto´ ci liczbowych
s
◮
s´
X=/=Y – nierówno´ c warto´ ci liczbowych
s
◮
s´
T1==T2 – identyczno´ c termów
◮
s´
T1/==T2 – nieidentyczno´ c termów
◮
X@<Y – porównywanie słownikowe
◮
@<, @<=, @>=, @>
◮
Aleksander Pohl WSZiB
Prolog 3
36. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
37. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Plan prezentacji
Operatory
Operacjy wyj´ cia/wej´ cia
s s
Predykaty wbudowane
Techniki programowania
Postscriptum
Aleksander Pohl WSZiB
Prolog 3
38. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
39. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
40. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
41. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Zbieranie wyników
bagof(X,P,L) – L lista obiektów X spełniajacych
˛
◮
predykat P
setof(X,P,L) – L posortowana lista obiektów
◮
X spełniajacych predykat P
˛
˛˙
findall(X,P,L) – podobny do bagof, z ta ró˙ nica, ze
˛z
◮
dla wyniku istotna jest tylko zmienna X
Aleksander Pohl WSZiB
Prolog 3
42. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
43. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
44. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
45. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Optymalizacja ostatniego wywołania
p(...) :- ....
◮
p(...) :- ....
◮
P(...) :- ...., !, p(...).
◮
Zmiana rekursji na iteracje
˛
◮
Aleksander Pohl WSZiB
Prolog 3
46. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
47. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
48. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
49. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Listy ró˙ nicowe (1)
z
conc([], L, L).
◮
conc([X|L1],L2,[X|L3]):-
◮
conc(L1,L2,L3).
Aleksander Pohl WSZiB
Prolog 3
50. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Listy ró˙ nicowe (2)
z
[a,b,c] → [a,b,c|T]-T
◮
[] → L-L
◮
conc(A1-Z1,Z1-Z2,A1-Z2).
◮
Aleksander Pohl WSZiB
Prolog 3
51. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Listy ró˙ nicowe (3)
z
... czyli conc(L1,L2,L3).
◮
?- conc([a,b,c|T1]-T1,[d,e|T2]-T2,L).
◮
Aleksander Pohl WSZiB
Prolog 3
52. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Plan prezentacji
Operatory
Operacjy wyj´ cia/wej´ cia
s s
Predykaty wbudowane
Techniki programowania
Postscriptum
Aleksander Pohl WSZiB
Prolog 3
53. Operatory Operacjy wyj´ cia/wej´ cia
s s 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
54. Operatory Operacjy wyj´ cia/wej´ cia
s s Predykaty wbudowane Techniki programowania Postscriptum
Dziekuje!
˛ ˛
Aleksander Pohl WSZiB
Prolog 3