AI&ES Prolog w2

background image

PROLOG-PROGRAMOWANIE W JĘZYKU LOGIKI

Literatura:

1. Clocksin W., Mellish C. Prolog programowanie, Helion,
Gliwice 2004.
2. Szajna J., Adamski M., Kozłowski T., Turbo Prolog,
WNT, Warszaw 1991.

Strony internetowe.
www/prolog_tutorial/pt_framer.htlm


http://home.agh.edu.pl/~mitu/jsi2004.htm
l

http://pl.wikipedia.org/wiki/Prolog

background image

PROGRAMOWANIE W JĘZYKU LOGIKI

Dostępne programy:

Turbo Prolog

– (pod DOS-em) obecnie już nie rozwijany

SWI Prolog

– wolne oprogramowanie wersje WIN i LINUX

Visual Prolog

– darmowa wersja edukacyjna.

Linki do innych wersji dostępne na stronie Wikipedii

http://pl.wikipedia.org/wiki/Prolog

background image

PROGRAMOWANIE W JĘZYKU LOGIKI

PROLOG język programowania powstały w Marsylii

w 1972 roku. Twórca Alain Colmerauer.

W tym samym roku:

- Intel wypuszcza procesor 8008,
- Powstaje pierwszy program poczty elektronicznej ,
pojawia się w nim symbol @,
- Dennis Ritche podaje specyfikację jezyka C,
- Powstaje Cray Research, twórca w 4 lata później
superkomputera Cray.

background image

Dziedziny zastosowań języka Prolog

relacyjne bazy danych,
logika matematyczna,
rozwiązywanie problemów abstrakcyjnych,
przetwarzanie języków naturalnych,
automatyzacja projektowania,
symboliczne rozwiązywanie równań,
analiza struktur biochemicznych,
zagadnienia sztucznej inteligencji.

background image

Cechy charakterystyczne języka

Prolog

Jest to język opisowy i deklaratywny,

podczas gdy
większość języków programowania ma
charakter
proceduralny.

Programowanie w Prologu polega głównie

na opisaniu
znanych faktów i relacji dotyczących
badanego problemu.

Programowanie w Prologu składa się z :

-Deklarowania faktów dotyczących obiektów i
relacji
miedzy nimi,
- Definiowania reguł dotyczących obiektów i
związków
między nimi,
- Zadawania zapytań o obiekty i związki
miedzy nimi.

background image

Wady języka Prolog

- nieefektywne przetwarzanie baz danych,

- zbyt ścisłe wnioskowanie,

- założenie o zamkniętości wiedzy, ( jeżeli nie można
wykazać jakiejś własności, przyjmuje się, że jest fałszywa).

background image

Niektóre pojęcia z logiki i programowania

- Literał - wartość wpisana bezpośrednio w kod programu.
W logice matematycznej każde zdanie proste lub jego
zaprzeczenie jest literałem.

-Klauzula – zbiór literałów, który jest prawdziwy, gdy ich
alternatywa jest prawdziwa.

- Klauzula Horna – klauzula, w której co najwyżej jeden
element jest niezanegowany.

background image

Niektóre pojęcia z logiki i programowania

TERM

- symbol stałej, oznacza pojedynczy byt lub

pojęcie, przykłady: angielski, wojtek,
chwila,

- symbol zmiennej, symbol ten może oznaczać
w
różnych chwilach różne byty, przykłady: X,
Człowiek,

- term złożony, składający się z symbolu
funkcyjnego i
uporządkowanego zbioru termów będących
jego
argumentami, przykłady:
żona(henryk),odległość( X,Y).

background image

Niektóre pojęcia z logiki i programowania

PREDYKAT

Nazwa relacji łączącej obiekty (argumenty),

przykłady:
ojciec(kazimierz, halina), corka(anna,
wladysław),
cenny(szafir).

Nazwy obiektów i relacji są dowolne.

Relacje mogą mieć dowolna liczbę
argumentów, np: gra1(jan, staszek, poker),
gra2(maria, halina, wojtek, anna, brydz).

background image

Przedstawianie wiedzy w Prologu

OBIEKTY i RELACJE

Prolog rozwiązuje problemy dotyczące obiektów i relacji
pomiędzy nimi, więc podana mu informacja ma również
głównie postać relacji.

Informacja, że Ewa ma zegarek mówi, że istnieje pewna
relacja pomiędzy dwoma obiektami Ewa i zegarek.
Zapisujemy to w postaci :
ewa(zegarek). lub zegarek(ewa).,
w zależności od sposobu dalszego wykorzystania tej
informacji.

background image

Przedstawianie wiedzy w Prologu

FAKTY

Informację, że Maria jest matką Jana zapisujemy w postaci:
matka(maria,jan).

Kolejność argumentów jest dowolna, ale musi być

jednakowa dla kolejnych takich relacji.

Nazwy obiektów występujących w nawiasach nazywamy

argumentami, samą zaś relację nazywamy predykatem.

Nazwy obiektów i predykatów piszemy z małej litery.

background image

Przedstawianie wiedzy w Prologu

ZAPYTANIA

Prolog jest językiem konwersacyjnym i komunikacja z

nim polega na ogół na zadawaniu pytań.

Po podaniu pytania Prolog przeszukuje stworzoną miedzy

innymi poprzez podanie faktów bazę danych i szuka faktów
pasujących do faktu podanego w zapytaniu. Nazywamy to
uzgadnianiem celu.

Dwa fakty pasują do siebie jeśli maja takie same

predykaty i takie same ich argumenty. Przykłady zapytań:
lubi(jan,piwo). Prolog odpowie Yes lub No.
lubi(jan,X).

Prolog wymieni obiekty, które lubi Jan.

lubi(Y,piwo).

Prolog wymieni obiekty, które lubią piwo.

background image

Przedstawianie wiedzy w Prologu

ZMIENNE

W Prologu obiekty mogą występować w postaci jawnej

( przykład jan) lub w postaci zmiennych którym konkretne
obiekty przypisuje Prolog.

Zmienne mogą być ukonkretnione, jeżeli jest jej już

przypisany jakiś obiekt, lub nieukonkretnione (swobodne),
w przeciwnym wypadku.

Nazwy zmiennych, podobnie jak nazwy predykatów i ich

argumentów są dowolne. Nazwy zmiennych piszemy
zawsze z dużej litery. Przykłady zmiennych:
X, NajmniejszaWartosc, SumaCiagu, ZyskPodzielony.

background image

Przedstawienie wiedzy w Prologu

KONIUNKCJA

Relacje występujące w bazie danych mogą mieć postać

bardziej złożoną niż tylko proste fakty. W tym celu stosuje
się koniunkcję. W Prologu oznacza ją przecinek „ ,”.

Zapytanie lubi(jan,maria), lubi(maria, jan) oznacza

koniunkcję celów.

Prolog szukając faktów spełniających koniunkcję celów

najpierw stara się spełnić cel począwszy od lewej a dopiero
po jego spełnieniu przechodzi do prób spełnienia kolejnych
celów, na prawo od spełnionego już celu.

background image

Przedstawienie wiedzy w Prologu

KONIUNKCJA cd

Zapytanie:

lubi(jan,X), kolorWlosow(X,jasne).
spowoduje najpierw próbę uzgodnienie celu lubi(jan,X).
Po jego ewentualnym uzgodnieniu X będzie juz
ukonkretnione X* i nastąpi próba uzgodnienia celu
kolorWłosów(X*,jasne).

Jeżeli próba ta nie powiedzie się to Prolog spróbuje

uzgodnić na nowo cel pierwszy a następnie dopiero cel
drugi. Taki sposób Prologu działania nazywamy
nawracaniem.

background image

Przedstawienie wiedzy w Prologu

REGUŁY

Jeżeli chcemy wprowadzić informacje tego samego

rodzaju o wielu obiektach to nie ma potrzeby wielokrotnego
wypisywania podobnych predykatów. Zamiast tego
używamy reguł. Informację, że X jest bratem Y jeżeli X jest
mężczyzną i X oraz Y mają tych samych rodziców w
Prologu zapisujemy następująco:
brat(X,Y):-mężczyzna(X), rodzice(X,Matka,Ojciec),
rodzice(Y,Matka,Ojciec).
Taki sposób przedstawienia informacji nazywamy reguła.
Ogólna postać GłowaReguły :-TreśćReguły.
Reguła kończy się kropką.

background image

Przedstawienie wiedzy w Prologu

Informacje dotyczące jakiegoś predykatu można

podawać w dwóch postaciach ;
-faktów,
-reguł.

Predykat definiuje się więc jako zbiór faktów i reguł.

Jedne i drugie nazywamy klauzulami predykatu.

background image

Przedstawienie wiedzy w Prologu

KOMENTARZE

W celu poprawienia czytelności programu stosujemy

komentarze;

% --------------------------- komentarz ----------------------------

/* ---------------------------- komentarz --------------------------*/

background image

SKŁADNIA PROLOGU

Program Prologu składa się z termów. Term to stała,
zmienna lub struktura. Każdy term zapisujemy jako ciąg
znaków. Dopuszczalne znaki w Prologu:

1. Duże litery alfabetu łacińskiego,

2. Małe litery alfabetu łacińskiego,

3. Cyfry {0,1,,,9}

4.Znali specjalne{+ - * / \ ~ ^ <> . ? @ # $ &

background image

SKŁADNIA PROLOGU

TERMY - STAŁE

Stałe nazywają konkretne obiekty lub konkretne relacje.

Istnieją dwa rodzaje stałych: atomy i liczby całkowite.
Istnieją dwa rodzaje atomów:
-składające się z liter i cyfr i znaku podkreślenia _
(muszą zaczynać się małą literą),
-składające się z wyłącznie z symboli.
Atom ujęty w pojedynczy cudzysłów ' może zawierać
dowolne znaki.

background image

SKŁADNIA PROLOGU

TERMY - ZMIENNE

Zmienne mają postać atomów, ale ich nazwy zaczynają

się dużą literą lub podkreśleniem _.
Zmienna anonimowa.
Czasami interesuje nas czy jakikolwiek obiekt jest w relacji
z innym obiektem. Używamy wtedy zmienne anonimowej _ .

Na przykład jeśli chcemy sprawdzić, czy Anna ma

jakąkolwiek siostrę formułujemy zapytanie siostra(anna,_).
Otrzymujemy wtedy odpowiedź Yes lub No.

Zmienne anonimowe są po to, aby nie wymyślać różnych

nazw zmiennych, które i tak nie będą nigdy użyte.

background image

SKŁADNIA PROLOGU

TERMY – STRUKTURY

Struktura to pojedynczy obiekt, składający się z zestawu

innych obiektów, zwanych składnikami struktury. Składniki
są pogrupowane w strukturę , aby ułatwić ich przetwarzanie.

Informację, że Jan posiada książkę Noce i Dnie

Marii Dąbrowskiej, wydaną w 1987 roku możemy zapisać
w postaci struktury:

posiada(jan(ksiazka(maria_dabrowska(noce_i_dnie(1987))))).

Struktury mogą występować w zapytaniach i mogą
zawierać zmienne.

background image

SKŁADNIA PROLOGU

OPERATORY

Ze względu na czytelność programu operacje

arytmetyczne zapisuje się zwykle przy pomocy operatorów.

Wyrażenie x+y*z zapisane jako struktura w Prologu

miałoby postać: +(x,*(y,z).

W Prologu operatory nie powodują żadnych obliczeń,

term 3+5 nie oznacza 8, jest tylko wariantowym zapisem
struktury +(3,5).

Operatory posiadają trzy cech: położenie, priorytet i

łączność.

background image

SKŁADNIA PROLOGU

OPERATORY – priorytety

Priorytet operatora mówi o kolejności operacji. Każdy

operator posiada w Prologu klasę priorytetu. Jest to liczba
całkowita, związana z danym operatorem. Konkretna jej
wartość zależy od wersji Prologu. Im niższa jest to liczba,
tym większy jest priorytet danej operacji. Zawsze + i – mają
niższy priorytet niż *i /.

background image

STRUKTURA PROGRAMU w PROLOGU


DOMAINS

liczba = integer

PREDICATES

suma(liczba, liczba,liczba)

CLAUSES

suma( SumaLiczb, Liczba1, Liczba2):-
SumaLiczb=Liczba1+Liczba2.

GOAL

suma(X,3,56).

Przykład

ex0000

E:\prolog\PROLOG.EXE

background image

SKŁADNIA PROLOGU

OPERATORY – łączność

Operatory łączne lewostronnie muszą mieć po lewej

stronie operacje o takim samym lub niższy priorytecie, a po
prawej o priorytecie niższym. Wszystkie operacje
arytmetyczne (dodawanie, odejmowanie, mnożenie,
dzielenie) są łącznymi lewostronnie. Struktura 8/4/4 jest
interpretowana jako(8/4)/4.

W praktyce używanie nawiasów eliminuje wątpliwości

dotyczące interpretacji.

Struktury zawierające operacje arytmetyczne są

strukturami jak inne i żadne obliczenia nie są dokonywane,
dopóki nie wymusi tego odpowiedni predykat.

background image

RÓWNOŚĆ I UNIFIKACJA

Operator = może być operatorem arytmetycznym
przypisania , w przypadku, gdy po lewej stronie występuje
pojedyncza zmienna nieukonkretniona.
Przykład:

ex01

.

W przeciwnym razie jest operator porównania.
Przykład:

ex02

W Prologu zmienna, której w klauzuli nadano już wartość

nie zmienia jej aż do zakończenia tej klauzuli.

background image

RÓWNOŚĆ I UNIFIKACJA cd

Unifikacja czyli ukonkretnianie (uzgadnianie) może

odbywać się w wyniku operacji przypisania lub też poprzez
uzgadnianie parametrów celu i klauzuli.

Uzgodnienie to może zajść jeżeli:

-cel i klauzula mają tą samą nazwę i można uzgodnić każdą
parę ich parametrów, to znaczy musi zachodzić jeden z
następujących warunków :
- obydwa parametry są zmiennymi (powiązanie zmiennych),
- jeden parametr jest zmienną, drugi stałą(ukonkretnienie
zmiennych,
- obydwa parametry są stałymi o tej samej wartości.

background image

RÓWNOŚĆ I UNIFIKACJA cd

Klauzula

Wywołanie Efekt uzgodnienia

a1(5,6)

a1(5,X)

X=6(ukonkretnienie zm.)

a1(5,6)

a1(Y,6)

Y=5 (ukonkretnienie zm.)

a1(5,A)

a1(5,Y)

Y=A (powiązanie zm.)

a1(5,6)

a1(6,Y)

bez ukonkretnienia

alfa(f(5,6))

alfa(X)

X=f(5,6)

alfa(f(5,6))

alfa(f(5,6))

bez ukonkretnienia

Przykład

ex03

background image

OPERACJE ARYTMETYCZE

Na operacje arytmetyczne składa się porównywanie liczb

oraz obliczanie wartości wyrażeń.

Porównywanie liczb:

=:=, =\=, <, >, =<, =>. Predykaty te wyliczają wartości
termów, traktując je jak wyrażenia algebraiczne.

Argumentami tych predykatów mogą być zmienne

ukonkretnione liczbami całkowitymi, liczby zapisane jako
stałe lub wyrażenia algebraiczne.

Obliczanie wartości wyrażeń:

Operator = oblicza wartość wyrażenia po prawej stronie,
wynik jest dopasowywany do lewego argumentu.

background image

SPEŁNIANIE CELÓW

Zapytanie ma zazwyczaj postać koniunkcji celów, które

mają być spełnione. Fakt zawarty w programie może od razu
spełnić cel. Reguła pozwala spełniać zadanie stopniowo
poprzez spełnianie koniunkcji jej podcelów. Klauzula może
zostać użyta jeśli pasuje do spełnianego celu. Jeżeli
w którymś miejscu reguły nie można spełnić celu
realizowana jest operacja nawracania to jest cofnięcie
programu i próba znalezienia alternatywnych rozwiązań.

Przykład zapytania w postaci koniunkcji

ex000.

background image

PROLOG -STRUKTURY DANYCH

Strukturę Prologu można zawsze przedstawić w postaci

drzewa. I tak klauzulę rodzice( jasio, anna, marian)
pokazuje drzewo:

rodzice

jasio

anna

filip

background image

PROLOG -STRUKTURY DANYCH

Struktury ksiazka(noce_i_dnie, autor((maria, dabrowska))

oraz +(a,*(b,c) można zapisać w postaci drzew:

+ ksiazka

a * noce_i_dnie

autor

b c maria dabrowska

Oba drzewa różnią się między sobą jedynie nazwami
wierzchołków.

Obie struktury mają taką samą postać, mają jedynie

różne nazwy węzłów.

background image

PROLOG -STRUKTURY DANYCH, LISTY

Lista jest dowolnej długości

uporządkowanym ciągiem elementów.
Elementami listy mogą być dowolne termy:
stałe, zmienne, struktury, w tym również listy.

Listę można zapisać w postaci specjalnego
rodzaju drzewa.
Lista jest albo struktura pustą, nie zawierająca
żadnych elementów, albo strukturą z dwiema
składowymi, głową i ogonem. Koniec listy
zapisujemy jako ogon będący listą pustą. Listę
pustą oznacza się symbolem []. Listę możemy
zapisać jako relację „ . ” której argumentami
są głowa i ogon. Listę zawierającą tylko jeden
element a zapisujemy więc w postaci .(a,[]).

background image

PROLOG -STRUKTURY DANYCH, LISTY

Odpowiada temu drzewo:

.

a [ ]

Z kolei lista składająca się z trzech atomów

a,b, c , może być zapisana w postaci .( a, .(b, .(
c, []))), lub w formie drzewa:

.

.

.

a

b

c

[]

background image

REKURENCJA W PROLOGU

Procedury odwołujące się do siebie samych

noszą nazwę procedur rekurencyjnych.
Muszą one składać się z dwóch elementów:
- warunku zakończenia rekurencji
- opisu procesu odwołania rekurencyjnego

Przykład: Obliczenie długości listy.
Warunek stopu:
dlugosc_listy([],0).
Opis odwołania rekurencyjnego:
dlugosc_listy([_|Ogon],I):-
dlugosc_listy(Ogon,J), I=J+1.

Jest to tak zwana rekurencja lewostronna

background image

REKURENCJA W PROLOGU cd

Rekurencja prawostronna polega na

wprowadzeniu dodatkowej zmiennej zwanej
akumulatorem.

dlugosc_listy(L,N):-
dlugosc_akumulatora(L,0,N).
dlugosc_akumulatora([],A,A).
dlugosc_akumulatora([_|Ogon],A,N):- A1 is A
+ 1,
dlugosc_akumulatora(Ogon,A1,N).

Na początku nadajemy akumulatorowi wartość
zero, aby w każdym odowłaniu zwiększać tą
wartość o jeden.

background image

PRZESZUKIWANIE REKURENCYJNE LIST

Listy przetwarza się dzieląc ją na głowę i

ogon. Listę z głową X i ogonem Y oznaczamy
symbolem [X|Y].

Chcemy sprawdzić, czy term X należy należy

do listy. W tym celu sprawdzamy,
1. czy term X jest równy termowi głowy listy

member(X,[X,_]), możemy też

zapisać

member(X,[Y|_]) :-X=Y.

2. czy term X należy do ogona listy:

member(X,[_|Y]):- member(X,Y).

Podsumowując sprawdzanie przynależności do
listy realizują dwie klauzule:
member(X,[X|_]).
member(X,[_|Y]:- member(X,Y).
Przykład

ex06

background image

ODWZOROWYWANIE STRUKTUR

Proces zamiany kolejnych składników starej
struktury na nową nazywamy
odwzorowywaniem.

Przykład
program zamieniający cyfry {0,1,2} na cyfry
{9,8,7}. Przykład

ex07

background image

A

B

C

D

E

F

F

G

AND

AND

AND

NOT

background image

bramkaAnd(0,0,0).

bramkaAnd(0,1,0).

bramkaAnd(1,0,0).
bramkaAnd(1,1,1).

bramkaNot(0,1).

bramkaNot(1,0).

uklad(A,B,C,D,E,F,G):-

bramkaAnd(A,B,D),
bramkaAnd(B,C,E),

bramkaAnd(E,F,G),

bramkaNot(D,F).

background image

OPERACJE WEJŚCIA , WYJŚCIA

Wejście:
- readChar( Znak) – wczytanie znaku, bez
oczekiwania
na wciśnięcie Enter,
- inkey(Znak) – sprawdza zawartość bufora
klawiatury,
pobiera pierwszy znak, jesli pusty zawodzi,
- readInt(Liczba) – czyta liczbę całkowitą,
- readReal(Liczba) – czyta liczbę rzeczywistą,
- readln(Wiersz) – czyta jedną zmienną
tekstową, zawodzi
po wciśnięciu Esc, czyta zmienne symbol i
string.
Wyjcie
-write(argument1, argument2,...)- wyświetlenie
podanego
ciągu stałych i zmiennych.

background image

Sterowanie działaniem programu

Mechanizm nawracania możemy modyfikować
korzystając
z wbudowanych predykatów:

odcięcie !

- powoduje zaprzestanie dalszego

ukonkretniania już ukonkretnionych
zmiennych,

fail/true

– predykat któr zawsze zawodzi/jest

spełniony

findAll

- predykat tworzący listę ze wszystkimi

rozwiązaniami,

not

– przeczenie,

repeat

– predykat generujący nawroty,

free/bound

- predykaty sprawdzające

ukonkretnienie
zmiennych

background image

Dziękuję za uwagę, zapraszam na

laboratorium.


Document Outline


Wyszukiwarka

Podobne podstrony:
PD W2 Wstep do j Prolog(2010 11 05) 1 1
PD W2 Wstep do j Prolog(2010 11 05) 1 1
Psycholgia wychowawcza W2
SP dzienni w2
w2 klasy(1)
W2 Chemiczne skladniki komorki
OK W2 System informacyjny i informatyczny
W2 6
Algebra w2
W2 Uproszczone formy rachunkowości
W2 i W3
ulog w2
UC W2
w2 podsumowanie

więcej podobnych podstron