PROLOG

Napsal Mgr.Radovan Kaluža (») 9. 5. 2006 v kategorii IT, internet, přečteno: 2382×
PROLOG vychází z formulí jazyka predikátové logiky 1. řádu. Je reprezentantem přístupu logického programování. Jeho název vznikl z anglického „Programming in Logic“. Využívá deklarativní přístup programování. Hlavní rysy jsou:
  • specifikuje se pouze čeho je třeba dosáhnout, aniž by bylo třeba rozepisovat přístup jak
  • příkazy lze formulovat podle jazyka pred. logiky, tzn. definice v téměř přirozeném jazyce, což zefektivňuje práci jak programátora, tak uživatele
  • program lze modifikovat (přidávat a odebírat pravidla) v průběhu jeho vykonávání

Všechny tyto vlastnosti umožňují reprezentovat úlohu formou symbolického popisu. Základem logického programování jsou termy a výrazy, které jsou reprezentovány: fakty, dotazy, pravidly

Fakta

Fakta jsou nejjednodušší výrazy vyjadřující vztah, relaci mezi objekty.

otec(petr, pavel) – Petr je otec Pavla

Stejně jako v před. logice se otec nazývá predikát a jména objektů atomy. Nejjednodušší program v jazyce PROLOG pak představuje konečná množina faktů. predikáty mohou být unární i bez parametru.

Dotaz

Dotaz je další formou logického výrazu. Jeho význam spočívá v podání odpovědi, zda určitá forma predikátu vyjadřuje vztah mezi objekty, nebo ne.
Dotaz ?-otec(petr,pavel) vrátí yes
Dotaz se liší od faktu předřazením ?- a v jazyce prolog se mu říká goal. Vzhledem k tomu, že PROLOG má pouze dvouhodnotovou logiku, odpověď no pak může znamenat buďto, že Petr není otcem anebo, že dané osoby vůbec neexistují. Kromě objektů lze stejně jako v predikátové logice použít proměnné.
?-otec(petr,X) vrátí X-pavel
Kromě konkrétních proměnných lze použít i anonymní proměnné, na jejichž významu nezáleží. Lze použít, pokud potřebujeme zjistit, zda je vůbec objekt v relaci:
?-otec(petr,_) vrátí yes tzn. petr je otcem
Opět stejně jako v před. logice výše uvedné jsou termy. Ty jsou tvořeny atomy, proměnnými, složenými termy. Ty se skládají z funktoru f a posloupnosti argumentů:
kniha(autor(alois, jirásek), název(staré_pověsti_české)) Spolu se složenými termy se uplatňuje i konjunkce dotazů:
?-otec(jan,X), muž(X) vrátí pouze mužské potomky Jana (tj. syny)

Pravidla

Pravidla jsou typem výrazů, jež umožňují definovat nové vztahy mezi termy na základě termů, které již existují. Pravidlo má tvar přičemž A je hlava pravidla a B tvoří tělo pravidla. Pravidlo lze interpretovat přirozeným jazykem jako: „A platí, jestliže platí B1 a B2 a … a Bn“. Nové vztahy lze definovat jako:
syn (X,Y) otec(X,Y), muž(X) Odvození se pak provádí použitím pravidla modus ponens, tj. z platnosti B a existence AB vyplývá B. Dotaz ?-syn(X,jan) se převede na ?-otec(jan,X), muž(X) a výsledkem jsou synové Jana. Predikát může mít někdy více možností tj.:
rodič(X,Y) otec(X,Y) rodič(X,Y) matka(X,Y)
Program vyhodnotí první možnost, pokud není nalezen výsledek, pokračuje na další možnost.

Fakta, dotazy a pravidla se také nazývají Hornovy klauzule a samotný logický program jazyka PROLOG je jejich konečná množina.

Seznam

Jak už bylo řečeno, jazyky umělé inteligence vyžadují bohatou vnitřní strukturu. U jazyka prolog to jsou seznamy a stromy. Prvky seznamu mohou být buďto atomy, složené termy nebo opět seznamy. Seznam je také tvořen hlavou (jedním prvek) a tělem (zbytkem seznamu). Seznam může být prázdný. Zapisuje se jako:
[první, druhý, třetí] nebo [první | [druhý, třetí]]

Seznam lze pak vypsat např. násl. způsobem:
vypis_seznam{[]}. //pokud je seznam prázdný vrať true
vypis_seznam{[H,T]} :- write(H), vypis_seznam(T). //Rozděl seznam na první prvek (Hlava H) a zbytek seznamu (Tělo T). Vypiš H a zpracuj T

Facebook Twitter Linkuj.cz

Komentáře

Zobrazit: standardní | od aktivních | poslední příspěvky | všechno
z IP *** | 24.5.2006 22:06
Nedávno jsem na tento jazyk narazil na wikipedii- škoda že jsem nešel sem, ušetřil bych si spoustu hledání smile smile
Honza z IP 85.70.208.*** | 26.12.2007 21:01
Ahj lidi, mám menší problém.. V prologu plavu (zlaté procedurální jazyky) a nevím si rady s jedním příkladem k zápočtu z logiky..
Zadání zní:
Přirozené číslo n je dokonalé, jestliže je rovno součtu svých dělitelů. Tj. např. děliteli čísla 6 jsou 1, 2, 3 a přitom platí, že 1+2+3 = 6. Napište predikát v Prologu, který určí, je-li zadané číslo dokonalé. Tedy např.

?- dokonale(5). no ?- dokonale(6). yes ?- dokonale(28). yesDále definujte predikát vypis_dokonale(N), který vypíše všechna dokonalá čísla od 1 do N na obrazovku
Kdyby mi tak někdo pomohl... smile děkuji..

JIK z IP 92.62.224.*** | 27.1.2009 18:57
Tohle by mělo být to co hledáš:

% zjisti, zda N je delitelem X
delitel(X,N) :- 0 is X mod N.

delitele(_,1,[1]) :- !.
delitele(X,Y,[Y|T]) :- A is Y-1, A>0, delitel(X,Y), delitele(X,A,T), !.
delitele(X,Y,T) :- A is Y-1, A>0, delitele(X,A,T).


% vypise do seznamu L vsechny delitele cisla X
delitele(X,L) :- delitele(X,X,L).

% dokolane prirozene cislo
perfect(X) :- delitele(X,[_|L]), sum(L,X).

% vypise vsechna dokonala prirozena cisla mensi nez N
perfectAll(0,[]) :- !.
perfectAll(X,[X|T]) :- perfect(X), X1 is X-1, perfectAll(X1,T), !.
perfectAll(X,T) :- X1 is X-1, perfectAll(X1,T).
Jirka z IP 78.128.199.*** | 12.5.2010 16:46
Zdravím,smile
dostal jsem ve škole za úkol naprogramovat šach.koncovku pro krále a věž (nejlepší a nejhorší případ). Nějak si nevím pořádně rady. Dost jsem se do toho zamotal. Potřeboval bych nějak poradit, jak to udělat.
Díky moc.
Ondra z IP 158.196.46.*** | 15.6.2010 21:19
Ahojte, mám takový problém, dostal jsem za úkoly tyto dva příklady.
1. substitute (X, Y, List1, List2) 
Predikát provede substituci všech výskytů hodnoty proměnné X v seznamu List1 za hodnotu proměné Y a výsledek uloží do seznamu List2.

2. minimum (List, X)
Predikát nalezne minimální hodnotu v seznamu List složeného z hodnot přirozených čísel a výsledek uloží do proměnné X.

Pomůžete mi někdo.

děkuji 

Ondra


Nový komentář

Téma:
Jméno:
Notif. e-mail *:
Komentář:
[*1*] [*2*] [*3*] [*4*] [*5*] [*6*] [*7*] [*8*] [*9*] [*10*] [*11*] [*12*] [*13*] [*14*] [*15*] [*16*] [*17*] [*18*] [*19*] [*20*] [*21*] [*22*] [*23*] [*24*] [*25*] [*26*] [*27*] [*28*] [*29*] [*30*] [*31*] [*32*] [*33*] [*34*] [*35*] [*36*] [*37*] [*38*] [*39*] [*40*] [*41*] [*42*] [*43*] [*44*] [*45*] [*46*] [*47*] [*48*] [*49*] [*50*]   [b] [obr]
Odpovězte prosím číslicemi: Součet čísel osm a tři