1 / 76

Програмиране на Пролог

Програмиране на Пролог. доц. Светла Бойчева Факултет по математика и информатика СУ “Св. Климент Охридски”. Работа с термове. част 7. (де)композиция на терм. +Term =.. ?List ?Term =.. +List List е списък, чийто първи елемент е функтор на Term,

Download Presentation

Програмиране на Пролог

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Програмиране на Пролог доц. Светла Бойчева Факултет по математика и информатика СУ “Св. Климент Охридски”

  2. Работа с термове част 7

  3. (де)композиция на терм +Term =.. ?List ?Term =.. +List List е списък, чийто първи елемент е функтор на Term, а останалите елементи на List са аргументите на този терм Term, т.е. | ?- product(0, n, n-1) =.. L. L = [product,0,n,n-1] | ?- n-1 =.. L. L = [-,n,1] | ?- product =.. L. L = [product] | ?- X=..[functor,arg1,arg2,arg3,arg4]. X = functor(arg1,arg2,arg3,arg4) ? Вместо този предикат може да се използват arg/3 и functor/3.

  4. Обработка на термове arg(?Arg, +Term, ?Value) functor(?Term, ?Functor, ?Arity)

  5. 1 ?- T=..[f,1,2]. T = f(1, 2) ; No 2 ?- f(X,Y)=..[f,1,2]. X = 1 Y = 2 Yes 3 ?- f(X,Y)=..L. L = [f, X, Y] Yes 4 ?- f(X,g(Y))=..L. L = [f, X, g(Y)] Yes

  6. 5 ?- T=f(1,2,g(X)),arg(2,T,V). T = f(1, 2, g(X)) V = 2 ; No 6 ?- T=f(1,2,g(X)),arg(3,T,V). T = f(1, 2, g(X)) V = g(X) Yes 7 ?- T=f(1,2,g(X)),functor(T,F,N). T = f(1, 2, g(X)) F = f N = 3 Yes 8 ?- functor(T,f,3). T = f(_G339, _G340, _G341) Yes

  7. Обработка на термове term_variables(+Term, -List) Унифицира List със списък от променливи, всяка от които съответства на една променлива от терма Term. Пример: ?- term_variables(a(X, b(Y, X), Z), L). L = [G367, G366, G371] X = G367 Y = G366 Z = G371

  8. ?- term_variables(a(X, b(Y, X), Z), L). L = [X, Y, Z] Yes 10 ?- term_variables(a(X, b(Y, a), X), L). L = [X, Y] Yes 11 ?- term_variables(sin(X), L). L = [X] Yes 12 ?- term_variables(sin(90), L). L = [] Yes 13 ?- term_variables(sin(log(X)), L). L = [X] Yes

  9. Обработка на термове setarg(+Arg, +Term, +Value) - при преудовлетворяване свързването на аргумента се освобождава nb_setarg(+Arg, +Term, +Value)-- при преудовлетворяване свързването на аргумента НЕ се освобождава

  10. f(1). f(2). f(3).

  11. 18 ?- T=g(X,Y,1),f(Z),setarg(1,T,Z). T = g(1, Y, 1) Z = 1 ; T = g(2, Y, 1) Z = 2 ; T = g(3, Y, 1) Z = 3 ; No

  12. 14 ?- T=f(X,Y,1),setarg(1,T,5). T = f(5, Y, 1) Yes 15 ?- T=f(X,X,1),setarg(1,T,5). T = f(5, X, 1) Yes 16 ?- T=f(X,Y,1),setarg(1,T,5),setarg(2,T,2). T = f(5, 2, 1) Yes

  13. Изпълнение на цел GoalTimes на брой пъти!!! (има проблем) succeeds_n_times(Goal, Times) :- Counter = counter(0), ( Goal, arg(1, Counter, N0), N is N0 + 1, nb_setarg(1, Counter, N), fail ; arg(1, Counter, Times) ).

  14. Определяне вида на терм var(X). - удовлетворява се, ако X е свободна променлива nonvar(X). - удовлетворява се, ако X е свързана променлива

  15. 7 ?- nonvar(X),X=5. No 8 ?- X=5,nonvar(X). X = 5 Yes 3 ?- X=5,var(X). No 4 ?- var(14323). No 5 ?- var(fdhhgdsj). No 6 ?- nonvar(X). No

  16. numbervars(?Term,+N,?M) Унифицира всяка от променливите на терма Term със специален терм, така че write(Term) (или writeq(Term)) отпечатват тези променливи като (A + (i mod 26))(i//26) където i се изменя от N до M-1. Именуването на променливите става отляво надясно. N трябва да бъде свързано с цяло число. Ако N=0 се получават имената на променливи A, B, ..., Z, A1, B1, и т.н.

  17. Пример 1 | ?- numbervars(term(X,Y,Z),28,M). M = 31, X = C1, Y = D1, Z = E1 ?

  18. Пример 1a | ?- X=5, numbervars(term(X,Y,Z),28,M). M = 30, X = 5, Y = C1, Z = D1 ? yes

  19. Пример 1b |?- X=5,numbervars(term(X,Y,Z),0,M). M = 2, X = 5, Y = A, Z = B ? yes

  20. Пример 1c |?- X=5,Y=7,Z=2,numbervars(term(X,Y,Z),0,M). M = 0, X = 5, Y = 7, Z = 2? yes

  21. Коментари numbervars(Term,0,M). • Може да се използва за преброяване на свободните(несвързани) променливи в Term. numbervars(Term,0,0). • Може да се използва за проверка дали всички променливи в Term са свързани променливи.

  22. Приложение на езика Пролог(семантични мрежи)

  23. Семантична мрежа animal isa active_at moving_method daylight bird fly isa isa colour albatross kiwi brown colour isa moving_method isa isa active_at Ross walk black_&_white Kim night Albert

  24. isa(bird,animal). isa(albatross,bird). isa(kiwi,bird). isa(ross,albatross). isa(albert,albatross). isa(kim,kiwi). moving_method(bird,fly). moving_method(kiwi,walk). active_at(bird,daylight). active_at(kiwi,night). colour(albatross,black_&_white). colour(kiwi,brown). moving_method(X,Method):- isa(X,SuperX), moving_method(SuperX,Method).

  25. fact(Fact):- call(Fact),!. fact(Fact):- Fact=..[Rel,Arg1,Arg2], isa(Arg1,SuperArg), SuperFact=..[Rel,SuperArg,Arg2], fact(SuperFact).

  26. | ?- fact(moving_method(kim,Method)). Method = walk ? | ?- fact(moving_method(albert,Method)). Method = fly ?

  27. Оператори част 8

  28. Оператори :- op(Precedence,Type,Name). • Precedence: 1 - 1200 • Type (ляво/дясно асоциативни): • постфиксни: xf, yf • префиксни: fx, fy • инфиксни: xfx, xfy, yfx • Name (име на оператор или списък от имена на оператори)

  29. Оператори :- op(900,fx,if). :- op(890,xfy,then). :- op(880,xfy,or). :- op(870,xfy,and). :- op(860,fx,not).

  30. Правила if gives_milk(X) then mammal(X). if has_feathers(X) and lays_eggs(X) then bird(X). if has_gills(X) and lays_eggs(X) then fish(X). if bird(X) and not penguin(X) then flies(X). if fish(X) then lives(X,sea). if mammal(X) or fish(X) or bird(X) then homeothermic(X). if mammal(X) and can_speak(X) then human(X). if bird(X) and can_speak(X) then parrot(X).

  31. :-op(800,xfy,loves). :-op(900,xfy,hates). john loves mary. peter loves ann. mary loves paul. john loves susan. ann loves john. mary loves peter. ann hates mary. peter hates paul. mary hates susan. X hates Y :- Y loves X, \+ X loves Y.

  32. Работа с динамичната база от данни част 9

  33. listing • listing(term). • :- dynamic <fact1>/n1 ,<fact2>/n2, • assert(<fact> ). • assertz(<fact> ). • asserta(<fact> ). • retract(<fact>). • retractall(<fact>)

  34. :-dynamic st/1. st(0). my_statistics:- write('This program is executed '), st(N),write(N),write(' times.'),nl. program(X):- write('Value '), write(X),nl, st(N), M is N+1, retract(st(N)), assert(st(M)).

  35. Приложение на езика Пролог(експертна система)

  36. Базаот факти :- dynamic fact/1. fact(has_feathers(tweety)). fact(lays_eggs(tweety)). fact(gives_milk(milka)). fact(mammal(john)). fact(can_speak(john)).

  37. Прав извод (forward chaining) Правила if gives_milk(X) then mammal(X). if has_feathers(X) and lays_eggs(X)then bird(X). if has_gills(X) and lays_eggs(X) then fish(X). if bird(X) and not penguin(X) then flies(X). ... fact(gives_milk(X)) Факти fact(has_feathers(tweety)). fact(lays_eggs(tweety)). fact(gives_milk(milka)). ...

  38. Прав извод (forward chaining) Правила if gives_milk(X) then mammal(X). if has_feathers(X) and lays_eggs(X)then bird(X). if has_gills(X) and lays_eggs(X) then fish(X). if bird(X) and not penguin(X) then flies(X). ... fact(mammal(milka)) fact(gives_milk(milka)) Факти fact(has_feathers(tweety)). fact(lays_eggs(tweety)). fact(gives_milk(milka)). ...

  39. Прав извод (forward chaining) derive :- derive_fact(P), write('Derived: '), write(P), nl, derive. derive.

  40. Прав извод (forward chaining) derive_fact(P) :- if Condition then P, ok(Condition), \+ fact(P), assertz(fact(P)).

  41. Прав извод (forward chaining) ok(P) :- fact(P). ok(P and Q) :- ok(P), ok(Q). ok(P or Q) :- ok(P); ok(Q).

  42. Прав извод | ?- derive. Derived: mammal(milka) Derived: bird(tweety) Derived: homeothermic(john) Derived: homeothermic(milka) Derived: homeothermic(tweety) Derived: human(john) yes

  43. Базаот факти - черна дъска fact(has_feathers(tweety)). fact(lays_eggs(tweety)). fact(gives_milk(milka)). fact(mammal(john)). fact(can_speak(john)). fact(mammal(milka)). fact(bird(tweety)). fact(homeothermic(john)). fact(homeothermic(milka)). fact(homeothermic(tweety)). fact(human(john)).

  44. Вход и изход част 10

  45. Работа с файлове • Предикатите за обработка на входни/изходни данни се изпълняват по подразбиране за текущия входно/изходен поток (I/O Stream). • Ето защо повечето такива предикати имат две версии: • една, при която се работи с текущия поток • друга, при която има допълнителен аргумент за указване на потока с който се работи

  46. Работа с файлове read(?Term) read(+Stream,?Term) Прочита от Stream следващия терм, който завършва с точка и го унифицира сTerm. Синтаксисът на терма трябва да съответства на стандартните декларации. При достигане до края на Streamпри read(Stream, Term)Term ще се унифицира сend_of_file. Следващите обръщения към read/2 за същия поток предизвикват грешка, освен в случаите когато потока е свързан с терминала.

  47. Работа с файлове write(?Term) [ISO] write(+Stream,?Term) [ISO] ЗаписваTermв потокаStreamв съответствие с текущите декларации на оператора.

  48. Работа с файлове writeq(?Term) [ISO] writeq(+Stream,?Term) [ISO] Подобно наwrite(Stream,Term),но имената на атомите и функторите се цитират, където е необходимо, за да може резултата да бъде приемлив като вход за read/2.

  49. ?- X=5, write(X). 5 ?- X=5, write(x=X). x=5 ?- write('Hello World!'). Hello World! ?- X=5,Y=10, write(x=X),nl,write(y=Y). x=5 y=10 Yes

  50. ?- read(Z). |: 34.67. Z = 34.67 Yes ?- read(Z). |: Hello. Yes ?- read(Z). |: 'Hello!'. Z = 'Hello!' Yes ?- read(Z). |: hello. Z = hello Yes

More Related