Laboratorium sztucznej inteligencji Laboratorium nr 2 Podstawy programowania w Prologu. Rekurencja



Pobieranie 249,74 Kb.
Strona1/2
Data23.03.2020
Rozmiar249,74 Kb.
  1   2



Laboratorium sztucznej inteligencji

Laboratorium nr 2

Podstawy programowania w Prologu. Rekurencja



opracowanie: mgr. inż. Magdalena Wilkołazka

Podstawy teoretyczne

    1. Predykat odcięcia - ! i predykat – fail.

Automatyczne nawracanie jest jedną z cech charakterystycznych Prologa. Czasami są sytuacje, kiedy takie nawracanie powoduje stratę czasu, bo przeszukiwanie rozwiązań prowadzi donikąd. Wtedy można zastosować operator !, który pozwala na zablokowanie procesu nawrotu w wybranym miejscu. Jest to predykat bezargumentowy zawsze prawdziwy, który w czasie swojej weryfikacji powoduje zaniechanie badania innych, pozostałych jeszcze do weryfikacji definicji predykatów na bieżącym poziomie drzewa wnioskowania (uniemożliwia dokonanie nawrotu powyżej miejsca, w którym został wstawiony znak odcięcia (!)).

Zastosowanie operatora odcięcia zmienia logicznie (deklaratywnie) zdanie. np.:



p :- a, b.

p :- c.

jest równoważne zdaniu:



p ⇔ (a &b) ∨ c.

Natomiast:



p :- a, !, b.

p :- c.

co jest równoważne zapisowi:



p ⇔ (a &b) ∨ (~a & c).

Należy pamiętać, że negacje działają poprawnie tylko dla zunifikowanych (określonych jakąś wartością) zmiennych.

Wyróżniamy dwa rodzaje odcięć:

• odcięcia „czerwone” - to takie, które zmieniają interpretację deklaratywną programu*, utrudniają jego zrozumienie i powodują utratę pewnych rozwiązań.

• odcięcia „zielone” - takie, które nie wpływają na interpretację deklaratywną programu, nie zmniejszają jego czytelności i zachowują wszystkie rozwiązania (choć obcinają drzewo poszukiwań)
Przykład

Jest dany predykat funkcja/2, który nie zawiedzie, gdy pierwszy argument X i drugi argument Y przyjmą wartości opisane warunkami:



  • Jeżeli X <3, to Y = 0.

  • Jeżeli X ≥ 3 i X < 6, to Y = 2.

  • Jeżeli X ≥ 6, to Y = 4.

Rozwiązanie:

funkcja( X , 0) :- X < 3,!.

funkcja( X , 2) :- X >= 3, X < 6, !.

funkcja( X , 4) :- X >= 6.

Zadać pytanie:



funkcja(1,Y),Y > 2.

Aby zwiększyć optymalność kodu można zapisać źródło w postaci następujących reguł:



  • Jeżeli X<3, to Y = 0.

  • W przeciwnym przypadku jeżeli X < 6, to Y = 2.

  • W przeciwnym przypadku Y = 4.

Rozwiązanie:

funkcja( X , 0) :-X < 3,!.

funkcja( X , 2) :- X < 6, !.

funkcja( X , 4).

Przykład2



indian(curry).

indian(dahl).

indian(tandoori).

indian(kurma).

mild(dahl).

mild(tandoori).

mild(kurma).

chinese(chow_mein).

chinese(chop_suey).

chinese(sweet_and_sour).

italian(pizza).

italian(spaghetti).

szukaj(X):-indian(X),write(X),!.

Predykat fail służy do wymuszania nawrotów; zamiast wpisywać średnik, aby wyszukać kolejne rozwiązanie możemy użyć fail.

Oto przykład:

nazwa1(1) :- write('Jeden').

nazwa1(2) :- write('Dwa').

nazwa1(3) :- write('Trzy').

nazwa1(_) :- write(' Nie wiem!').

działanie Prologa:



?- nazwa1(2).

Dwa

Yes

?- nazwa1(2), fail.

Dwa Nie wiem!

No

?- nazwa1(X), fail.

JedenDwaTrzy Nie wiem!

No

W przypadku, gdy połączy się fail z predykatem odcięcia pojawią się takie wyniki:



nazwa2(1) :- !, write('Jeden').

nazwa2(2) :- !, write('Dwa').

nazwa2(3) :- !, write('Trzy').

nazwa2(_) :- write(' Nie wiem!').

Wyniki:


?- nazwa2(2).

Dwa

Yes

?- nazwa2(2), fail.

Dwa

No

?- nazwa2(X), fail.

Jeden

No

    1. If-else

Istnieje w prologu wbudowany predykat, który umożliwia wyrażenie konstrukcji if-then-else. W prologu if A then B else C można zapisać jako (A->B;C). Prolog to odczytuje, jako: spróbuj cel A, jesli jest on prawdziwy przejdź do celu B i zignoruj C. Jeżeli A zawiedzie, realizowany jest cel C i ignorowany B. Predykat max z wykorzystaniem konstrukcji if-then-else jest przedstawiony, jako:

max(X,Y,Z):-(X=Z=Y;Z=X).



    1. Operacje porównania.



  1. Rekurencja

Odwołanie reguły do samej siebie nazywamy rekurencją – rekurencja jest jedną z podstawowych operacji w prologu.



: files -> 146935 -> public
public -> Operacje arytmetyczne
public -> Kolejne kroki tej metody to
public -> Podstawy o czym będziemy mówić? Krótka historia C++
public -> Zadania z bramek logicznych I projektowania układów
public -> Liczby rzeczywiste, wprowadzane do komputera w zapisie dziesiętnym, podlegają automatycznemu przetworzeniu do jednej z postaci przewidzianych w standardzie ieee 754-2008
public -> Na dzisiejszych ćwiczeniach zostanie pokazany proces generowania kodu na podstawie przykładowego diagramu klas opisującego sklep inetrnetowy
public -> Przeliczanie liczb w systemie dziesiętnym na kod U2 I odwrotnie
public -> 1. Operacje arytmetyczne na liczbach w różnych systemach liczbowych dodawanie, odejmowanie, mnożenie i dzielenie
public -> Laboratorium nr 11
public -> Instrukcja switch I typ wyliczeniowy


  1   2


©operacji.org 2019
wyślij wiadomość

    Strona główna