北京医院召开2017年医联体年终总结及表彰大会
Pojawienie si? | 百度 其中,包括万能险和投连险在内的理财型业务保费合计亿元,较2016年同期大幅减少880亿,降幅%,占互联网人身保险保费的%,较2016年同期下降%。 |
---|---|
Paradygmat | |
Typowanie |
beztypowy |
Implementacje | |
Pochodne | |
Aktualna wersja stabilna |
9.2.x |
Twórca | |
Platforma sprz?towa | |
Platforma systemowa |
Prolog (od francuskiego Programmation en Logique) – jeden z najpopularniejszych j?zyków programowania logicznego. Prolog powsta? jako j?zyk programowania s?u??cy do automatycznej analizy j?zyków naturalnych, jest jednak j?zykiem ogólnego zastosowania, szczególnie dobrze sprawdzaj?cym si? w programach zwi?zanych ze sztuczn? inteligencj?. Prolog w przeciwieństwie do wi?kszo?ci popularnych j?zyków jest j?zykiem deklaratywnym.
Program w Prologu sk?ada si? z zestawu klauzul, gdzie ka?da klauzula jest faktem lub regu?? wnioskowania. Aby uruchomi? program, nale?y wprowadzi? odpowiednie zapytanie. Prolog jest j?zykiem programowania s?u??cym do rozwi?zywania problemów, które dotycz? obiektów i relacji mi?dzy obiektami. Mówi?c ?John ma ksi??k?.”, deklarujemy relacje mi?dzy obiektem ?John”, a drugim indywidualnym obiektem ?ksi??ka”. Dodatkowo relacja okre?la konkretn? kolejno??: John jest w?a?cicielem ksi??ki, a nie ksi??ka w?a?cicielem Johna. Zadaj?c pytanie ?Czy John ma ksi??k??” chcemy dowiedzie? si? o relacji mi?dzy tymi dwoma obiektami. Du?o problemów mo?e by? wyra?onych okre?laj?c obiekty i relacje mi?dzy nimi. W Prologu ?obiekt” odnosi si? do bytu, który mo?e by? prezentowany przy u?yciu termu. Wa?ne jest, aby zrozumie?, ?e regu?y s? zazwyczaj uproszczone i w rzeczywisto?ci znacz? wi?cej ni? zawiera to regu?a[1].
Prace nad projektem, dzi?ki któremu powsta? Prolog rozpocz??y si? ju? pod koniec 1970 roku, niemniej jednak wst?pna wersja Prologu zosta?a stworzona w 1971 roku przez Alaina Colmeraurera i Phillipe’a Roussela. Systemy Q, a tak?e do?wiadczenie nabyte przez Alaina Colmeraurera w trakcie ich wdra?ania, mia?y znacz?cy wp?yw na powstanie Prologu. Zal??ka j?zyka Prolog autorzy dopatruj? si? w artykule Alana Robinsona ?Logika zorientowana maszynowo oparta na zasadzie rezolucji”, gdy? artyku? ten by? ?ród?em prac na temat automatyzacji dowodzenia twierdzeń, a taka jest zasadniczo budowa Prolog[2].
Prolog opiera si? na rachunku predykatowym pierwszego rz?du, jednak ogranicza si? tylko do klauzul Horna. Istniej? w nim ponadto wbudowane predykaty wy?szego rz?du.
Ogólne zasady
[edytuj | edytuj kod]W Prologu podaje si? baz? faktów i regu?. Potem mo?na wykonywa? zapytania na tej bazie. Podstawow? jednostk? w Prologu jest predykat. Predykat sk?ada si? z nag?ówka i argumentów, na przyk?ad: ojciec(tomasz, agata)
, gdzie ojciec
to nag?ówek a tomasz
i agata
to argumenty. Predykat mo?e zosta? u?yty do wyra?enia pewnych faktów o ?wiecie, które s? znane programowi. W tym przypadku programista musi nada? im znaczenie. Jedn? z interpretacji zdania ojciec(tomasz, agata)
jest ?tomasz to ojciec agaty”. Równie dobrze jednak mog?oby to znaczy? ?ojcem tomasza jest agata”. Prolog nie zajmuje si? znaczeniem stwierdzeń. Wszystko co robi to manipulacja symbolami w oparciu o regu?y. Dlatego mo?na wybra? dowolny sposób zapisu tego, ?e ?tomasz to ojciec agaty”, pod warunkiem konsekwentnego przestrzegania kolejno?ci argumentów w ca?ym programie[1].
Pewne predykaty mog?, oprócz wyra?ania faktów, mie? dodatkow? funkcjonalno??, jak na przyk?ad wbudowany predykat
write('Cze??').
który wypisuje na ekranie ?Cze??”.
Regu?y
[edytuj | edytuj kod]Baza danych Prologu mo?e te? zawiera? regu?y. Przyk?ad regu?y to:
jest(?wiat?o) :- w??czony(przycisk).
Zapis :-
oznacza ?wtedy, gdy” lub ?je?li”. Ta regu?a oznacza, ?e zdanie jest(?wiat?o)
jest prawdziwe wtedy, gdy prawdziwe jest zdanie w??czony(przycisk)
. Ka?da regu?a musi by? zakończona kropk?. Regu?y mog? u?ywa? zmiennych. Zmienne zapisuje si? zaczynaj?c od wielkiej litery, dla odró?nienia od sta?ych, zaczynaj?cych si? ma??. Na przyk?ad:
ojciec(X, Y) :- rodzic(X, Y), jest_rodzaju_m?skiego(X).
To oznacza: ?dla ka?dych X i Y, je?li rodzic(X,Y) i jest_rodzaju_m?skiego(X) to ojciec(X, Y). Przes?anka i wniosek s? zapisane w odwrotnej kolejno?ci ni? zwykle w logice. Co wi?cej, regu?y musz? mie? predykat jako wniosek. Nie mo?na napisa? regu?y a;b :- c
, czyli ?je?li c to (a lub b)”. Wynika to z ograniczenia zapisu do klauzul Horna.
Zapytania
[edytuj | edytuj kod]Kiedy zosta?y zdefiniowane fakty mo?na zada? pytania na ich temat. Zapytanie w Prologu wygl?da dok?adnie jak fakt, ale przed nim nale?y postawi? znak zapytania:
?- ojciec(tomasz, agata).
co znaczy?oby: ?Czy Tomasz jest ojcem Agaty?”.
Kiedy pytanie jest zadawane w Prologu, system przeszukuje ca?? zdefiniowan? baz?, aby znale?? fakty, które ujednolic? fakt w pytaniu. Je?eli znajdzie je to odpowie – yes, je?eli nie istniej? zwróci odpowied? – no[1].
Dopasowywanie wyra?eń
[edytuj | edytuj kod]Dopasowywanie jest jednym z fundamentów Prologu. Definicja dopasowywania wyra?eń[3]:
- Je?eli term1 i term2 s? sta?ymi, to term1 i term2 s? równe, wtedy i tylko wtedy, gdy s? tym samym atomem lub t? sam? liczb?.
- Je?eli term1 jest zmienn?, a term2 jest jakimkolwiek typem termu, to term1 i term2 s? równe, gdy term1 jest instancj? term2. Podobnie jest, gdy term2 jest zmienn?, a term1 jest jakimkolwiek typem termu. (Je?eli term1 i term2 s? zmiennymi, to s? swoimi instancjami i mówimy, ?e wspó?dziel? warto?ci.)
- Je?eli term1 i term2 s? termami z?o?onymi, to s? równe wtedy i tylko wtedy, gdy spe?niaj? kolejne wymienione warunki. Maj? one ten sam funktor i arno??. Wszystkie ich koresponduj?ce argumenty pasuj?. Instancje zmiennych s? zgodne.
- Dwa termy s? równe, wtedy i tylko wtedy, gdy wynika to z poprzednich trzech klauzul.
Listy
[edytuj | edytuj kod]Lista jest uporz?dkowan? sekwencj? termów zapisanych w nawiasach kwadratowych przedzielonych przecinkami[4]:
[jab?ko, gruszka, pomarańcza, truskawki]
[1,2,4,7]
[(2+2),dom(texas), X]
[[a,b,c],lista]
Elementami listy mog? by? wszystkie rodzaje termów. Lista mo?e by? tworzona i rozk?adana dzi?ki unifikacji. Ka?da lista mo?e by? podzielona na g?ow? i ogon poprzez symbol ?|”. Ogon listy zawsze jest list?, natomiast g?owa listy jest elementem, np.
[a|[b,c,d]] = [a,b,c,d]
[a|[]] = [a]
Rekurencja
[edytuj | edytuj kod]Podobnie jak w innych j?zykach programowania w Prologu mo?na u?ywa? rekurencji. Rekurencja pozwala na wykonywanie dzia?ań na li?cie, szukanie konkretnego elementu lub wykonywanie konkretnych dzia?ań na ka?dym napotkanym elemencie – poprzez roz?o?enie problemu na proste elementy, i zst?puj?ce powtarzanie algorytmu. Procedura kończy si?, gdy nie jest potrzebne ponowne wywo?anie[4].
Przyk?ady
[edytuj | edytuj kod]Operacje na listach
[edytuj | edytuj kod]% list_member(X,Y) = X nale?y do listy Y
% reimplementacja standardowego member(X,Y)
list_member(X, [X|_]).
list_member(X, [_|Y]) :-
list_member(X, Y).
% list_append(X,Y,Z) = Z powstaje ze sklejenia X i Y
% reimplementacja standardowego append(X,Y,Z)
list_append([], X, X).
list_append([H|T], X, [H|Y]) :-
list_append(T, X, Y).
% suma_elementow_listy(Lista, N) = N jest sum? elementów nale??cych do Listy
suma_elementow_listy([], 0).
suma_elementow_listy([H|T], Wynik) :-
suma_elementow_listy(T, Tmp),
Wynik is H+Tmp.
% jak wy?ej, lecz z u?yciem rekurencji prawostronnej
suma_elementow_listy_tail(Lista, Wynik) :-
suma_elementow_listy_tail(Lista, 0, Wynik).
suma_elementow_listy_tail([], Wynik, Wynik).
suma_elementow_listy_tail([H|T], Akumulator, Wynik) :-
Akumulator2 is H+Akumulator, suma_elementow_listy_tail(T, Akumulator2, Wynik).
Przypisy
[edytuj | edytuj kod]- ↑ a b c Clocksin W.F., Mellish Ch.S. (2003) Programming in Prolog.
- ↑ Colmerauer A., Roussel P. (1992) The birth of Prolog. In: HOPL-II The second ACM SIGPLAN conference on History of programming languages Pages 37-52.
- ↑ Blackburn P., Bos J., Striegnitz K. (2006) Learn Prolog Now!
- ↑ a b Covington M.A., Nute D., Vellino A. (1995) Prolog programming in depth.