Пролог (програмски јазик)Пролог (англиски: Prolog) — логички програмски јазик со општа намена кој се асоцира со вештачка интелигенција и компјутерска лингвистика.[1][2][3] Основите на Пролог се засноваат на логиката од прв ред и формалната логика. За разлика од многу други програмски јазици, Пролог е декларативен јазик, што значи дека програмската логика се изразува преку релации, прикажани преку факти и правила на заклучување. Пресметувањата се иницираат со поставување на прашања.[4] Овој програмски јазик е создаден од групата Alain Colmerauer во почетокот на седумдесеттите години, додека првиот систем е создаден во 1972 година од Colmerauer со помош на Philippe Roussel.[5][6] Prolog е еден од првите логички програмски јазици, и денес сè уште претставува еден од најпопуларните логички јазици достапен во многу комерцијални и бесплатни имплементации. Првично наменет за обработка на природните јазиции, неговата употреба се проширува во многу други области како докази на теореми,[7] експертни системи,[8] игри, автоматизирани системи за одговарање на прашања, онтологии и софистицирани контролни системи. Модерните развојни околини за Пролог, поддржуваат создавање на графички кориснички интерфејси, како и административни и мрежни апликации. Синтакса и семантикаВо Пролог, програмската логика е изразена преку релации, додека пресметките се засноваат на прашања упатени до релациите. Релациите и прашањата се конструираат со единствениот податочен тип term.[4] Релациите се дефинирани со клаузи. За дадено прашање, механизмот во Prolog се обидува да најде одбивање за негираното прашање. Попрецизно ова значи дека прашањето се негира, и во случај да се најде инстанца од базата на знаење која го побива негираното прашање, следува дека оваа инстанца е логичка последица на програмата. Ова го прави Пролог погоден за работа со бази на податоци, симболичка математика и апликации за манупилација со јазици. Во случаи кога логичката парадигма не може да реши одреден проблем, програмерот има можност да употреби одредена доза на конвенционалното императивно програмирање. Податочни типовиOОсновен податочен тип во Prolog е term. Term може да биде атом, број, променлива или сложен term.
Специјални случаи на сложен term:
Правила и фактиProlog програмите опишуваат релации, кои се дефинирани преку клаузули. Постојат два типа на клаузули: факти и правила. Правилото ја има следната форма Head :- Body. и истото се чита на следниот начин "Head е вистина ако Body е вистина". Телото на едно правило се состои од повици до предикати. Исто така во телото се користат и конјункција и дисјункција. Клаузула со празно тело се нарекува факт. На пример cat(tom). што исто така може да се запише преку правилото cat(tom) :- true. Предикатот Ако е дадено горното правило, тогаш моше да се постават прашањата: is tom a cat? ?- cat(tom). Yes what things are cats? ?- cat(X). X = tom Клаузули со тела се нарекуваат правила. Пример за правило е следното: animal(X):- cat(X). Доколку го додадеме ова правило и потоа прашаме what things are animals? ?- animal(X). X = tom Поради релационите одлики на предикатите, тие можат да се користат во различни насоки. На пример Како јазик со општа намена, Пролог нуди и одредени рутини како input/output, употреба на графика или различни повици за комуникација со оперативниот систем. ЕвалуацијаИзвршувањето на програма напишана во Prolog, се иницира со поставување на прашање од страна на корисникот. Логички, механизмот на Prolog се обидува да пронајде одбивање на негацијата на прашањето. Овој метод на пролог се нарекува SLD резолуција. Ако негацијата на прашето може да биде одбиено, тогаш следува дека инстанцата која го задоволува тој услов претставува логичка последица на програмата. Во тој случај сите променливи кои ги задоволиле условите се враќаат на корисникот, и за прашањето се вели дека било успешно. Следниот пример ја илустрира работата на овој механизам: mother_child(trude, sally).
father_child(tom, sally).
father_child(tom, erica).
father_child(mike, tom).
sibling(X, Y) :- parent_child(Z, X), parent_child(Z, Y).
parent_child(X, Y) :- father_child(X, Y).
parent_child(X, Y) :- mother_child(X, Y).
This results in the following query being evaluated as true: ?- sibling(sally, erica). Yes За дадениот пример треба да се забележи дека програмата како вистинит одговор ќе даде и за следниот случај, Циклуси и рекурзијаИтеративните алгоритми во Пролог можат да се имплементираат со употреба на рекурзивни предикати. ПримериСледуваат пример програми напишани во Prolog. Hello worldПример за прашање: ?- write('Hello world!'), nl.
Hello world!
true.
?-
Оптимизација на компајлерБило која пресметка може да се изрази декларативно како низа од состојби кои минуваат една во друга. На пример, оптимизиран комапјлер со три премини може да се имплементира како релација помеѓу првичната програма и нејзината оптимална форма: program_optimized(Prog0, Prog) :-
optimization_pass_1(Prog0, Prog1),
optimization_pass_2(Prog1, Prog2),
optimization_pass_3(Prog2, Prog).
или евивалентно со употреба на DCG (definite clause grammar) нотација: program_optimized --> optimization_pass_1, optimization_pass_2, optimization_pass_3.
Брзо сортирањеСледува алгоритмот за брзо сортирање (Quicksort) имплементиран во Prolog: partition([], _, [], []).
partition([X|Xs], Pivot, Smalls, Bigs) :-
( X @< Pivot ->
Smalls = [X|Rest],
partition(Xs, Pivot, Rest, Bigs)
; Bigs = [X|Rest],
partition(Xs, Pivot, Smalls, Rest)
).
quicksort([]) --> [].
quicksort([X|Xs]) -->
{ partition(Xs, X, Smaller, Bigger) },
quicksort(Smaller), [X], quicksort(Bigger).
ШемиШема претставува решение кое се користи повеќепати за проблеми кои се чести во софтверскиот дизајн. Во пролог шемите се јавуваат под две имиња, скелети и техники,[9][10] клишеа,[11] program schemata,[12] и логичка описна шема.[13] An alternative to design patterns is higher order programming.[14] Логика од повисок редПо дефиниција, логиката од прв ред не дозволува квантификација на предикатите. Предикат со логика од повисок ред е предикат кој како аргументи прима еден или повеќе други предикати. Пролог има предефинирани предикати со логика од повисок ред, на пример МодулиЗа големи програмски решенија, Пролог нуди систем на модули. Овој систем е стандардазиран од ISO.[16] Но, не сите компајлери подршуваат модулирање, па постојат проблеми во компатибилност на различни компајлери.[17] ИмплементацијаISO PrologСтандардниот ISO Prolog се состои од два дела. ISO/IEC 13211-1,[15][18] објавен во 1995, цели кон стандардизација на постоечките имплементации на јадрените елементи на Пролог. ISO/IEC 13211-2,[15] објавен во 2000, ги стандардизира модулите на стандардот. Стандардот се одржува од SC22 работната група.[19] ANSI X3J17 е надгледувачка група за овој стандард.[20] Критички освртИако Пролог е широко употребуван во истражувањата и едукацијата, тој и останатите логички програмски јазици немаат начително влијание врз компјутерската индустрија генерално.[21] Повеќето апликации се мали за индустриските стандарди, со ретки прекорочувања од 100,000 линии на код.[21][22] Програмирање на големи апликации е комплицирано поради фактот дека не сите компајлери поддржуваат работа со модули.[17] Портабилноста исто се јавува како проблем. Слични програмски јазици
Наводи
Дополнителна литература
Дополнителни врскиАнглиските Викикниги нудат повеќе материјал на тема:
|
Portal di Ensiklopedia Dunia