770 likes | 932 Views
Програмиране на Пролог. доц. Светла Бойчева Факултет по математика и информатика СУ “Св. Климент Охридски”. Работа с термове. част 7. (де)композиция на терм. +Term =.. ?List ?Term =.. +List List е списък, чийто първи елемент е функтор на Term,
E N D
Програмиране на Пролог доц. Светла Бойчева Факултет по математика и информатика СУ “Св. Климент Охридски”
Работа с термове част 7
(де)композиция на терм +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.
Обработка на термове arg(?Arg, +Term, ?Value) functor(?Term, ?Functor, ?Arity)
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
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
Обработка на термове 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
?- 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
Обработка на термове setarg(+Arg, +Term, +Value) - при преудовлетворяване свързването на аргумента се освобождава nb_setarg(+Arg, +Term, +Value)-- при преудовлетворяване свързването на аргумента НЕ се освобождава
f(1). f(2). f(3).
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
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
Изпълнение на цел 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) ).
Определяне вида на терм var(X). - удовлетворява се, ако X е свободна променлива nonvar(X). - удовлетворява се, ако X е свързана променлива
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
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, и т.н.
Пример 1 | ?- numbervars(term(X,Y,Z),28,M). M = 31, X = C1, Y = D1, Z = E1 ?
Пример 1a | ?- X=5, numbervars(term(X,Y,Z),28,M). M = 30, X = 5, Y = C1, Z = D1 ? yes
Пример 1b |?- X=5,numbervars(term(X,Y,Z),0,M). M = 2, X = 5, Y = A, Z = B ? yes
Пример 1c |?- X=5,Y=7,Z=2,numbervars(term(X,Y,Z),0,M). M = 0, X = 5, Y = 7, Z = 2? yes
Коментари numbervars(Term,0,M). • Може да се използва за преброяване на свободните(несвързани) променливи в Term. numbervars(Term,0,0). • Може да се използва за проверка дали всички променливи в Term са свързани променливи.
Приложение на езика Пролог(семантични мрежи)
Семантична мрежа 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
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).
fact(Fact):- call(Fact),!. fact(Fact):- Fact=..[Rel,Arg1,Arg2], isa(Arg1,SuperArg), SuperFact=..[Rel,SuperArg,Arg2], fact(SuperFact).
| ?- fact(moving_method(kim,Method)). Method = walk ? | ?- fact(moving_method(albert,Method)). Method = fly ?
Оператори част 8
Оператори :- op(Precedence,Type,Name). • Precedence: 1 - 1200 • Type (ляво/дясно асоциативни): • постфиксни: xf, yf • префиксни: fx, fy • инфиксни: xfx, xfy, yfx • Name (име на оператор или списък от имена на оператори)
Оператори :- op(900,fx,if). :- op(890,xfy,then). :- op(880,xfy,or). :- op(870,xfy,and). :- op(860,fx,not).
Правила 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).
:-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.
Работа с динамичната база от данни част 9
listing • listing(term). • :- dynamic <fact1>/n1 ,<fact2>/n2, • assert(<fact> ). • assertz(<fact> ). • asserta(<fact> ). • retract(<fact>). • retractall(<fact>)
:-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)).
Приложение на езика Пролог(експертна система)
Базаот факти :- dynamic fact/1. fact(has_feathers(tweety)). fact(lays_eggs(tweety)). fact(gives_milk(milka)). fact(mammal(john)). fact(can_speak(john)).
Прав извод (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)). ...
Прав извод (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)). ...
Прав извод (forward chaining) derive :- derive_fact(P), write('Derived: '), write(P), nl, derive. derive.
Прав извод (forward chaining) derive_fact(P) :- if Condition then P, ok(Condition), \+ fact(P), assertz(fact(P)).
Прав извод (forward chaining) ok(P) :- fact(P). ok(P and Q) :- ok(P), ok(Q). ok(P or Q) :- ok(P); ok(Q).
Прав извод | ?- derive. Derived: mammal(milka) Derived: bird(tweety) Derived: homeothermic(john) Derived: homeothermic(milka) Derived: homeothermic(tweety) Derived: human(john) yes
Базаот факти - черна дъска 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)).
Вход и изход част 10
Работа с файлове • Предикатите за обработка на входни/изходни данни се изпълняват по подразбиране за текущия входно/изходен поток (I/O Stream). • Ето защо повечето такива предикати имат две версии: • една, при която се работи с текущия поток • друга, при която има допълнителен аргумент за указване на потока с който се работи
Работа с файлове read(?Term) read(+Stream,?Term) Прочита от Stream следващия терм, който завършва с точка и го унифицира сTerm. Синтаксисът на терма трябва да съответства на стандартните декларации. При достигане до края на Streamпри read(Stream, Term)Term ще се унифицира сend_of_file. Следващите обръщения към read/2 за същия поток предизвикват грешка, освен в случаите когато потока е свързан с терминала.
Работа с файлове write(?Term) [ISO] write(+Stream,?Term) [ISO] ЗаписваTermв потокаStreamв съответствие с текущите декларации на оператора.
Работа с файлове writeq(?Term) [ISO] writeq(+Stream,?Term) [ISO] Подобно наwrite(Stream,Term),но имената на атомите и функторите се цитират, където е необходимо, за да може резултата да бъде приемлив като вход за read/2.
?- 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
?- read(Z). |: 34.67. Z = 34.67 Yes ?- read(Z). |: Hello. Yes ?- read(Z). |: 'Hello!'. Z = 'Hello!' Yes ?- read(Z). |: hello. Z = hello Yes