prolog - programowanie w logice

156
Programowanie w logice Prolog Piotr Fulmański

Upload: jakub-daze

Post on 19-Oct-2015

35 views

Category:

Documents


6 download

TRANSCRIPT

  • Programowanie w logiceProlog

    Piotr Fulmaski

  • Piotr Fulmaski1 Wydzia Matematyki i Informatyki,e-mail: [email protected] Uniwersytet dzki

    Banacha 22, 90-238, dPolska

    Data ostaniej modyfikacji: 18 maja 2009

  • Spis treci

    Wstp i

    1 Podstawy 11.1 Zdumiewajcy pocztek . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Obiekty i relacje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

    1.2.1 Obiekt klasyczny . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.2.2 Obiekt w Prologu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    1.3 Program w Prologu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.3.1 Struktura i skadnia . . . . . . . . . . . . . . . . . . . . . . . . . . 61.3.2 Praca z programem zapytania . . . . . . . . . . . . . . . . . . . . 8

    1.4 Pytania i odpowiedzi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    2 Skadnia Prologu 112.1 Termy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.2 Klauzule, program i zapytania . . . . . . . . . . . . . . . . . . . . . . . . . 132.3 Pytania i odpowiedzi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

    3 Ewaluacja zapytania 213.1 Dopasowywanie wyrae . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213.2 Obliczanie celu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233.3 Pytania i odpowiedzi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

    4 Listy 334.1 Skadnia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334.2 Gowa i ogon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344.3 Pytania i odpowiedzi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

    5 Odcicie 415.1 Wiele rozwiza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415.2 Odcicie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475.3 Pytania i odpowiedzi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

    6 Wejcie i wyjcie. Operatory 536.1 Czytanie i pisanie termw . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

    6.1.1 Czytanie termw . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.1.2 Pisanie termw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

    6.2 Czytanie i pisanie znakw . . . . . . . . . . . . . . . . . . . . . . . . . . . 566.2.1 Czytanie znakw . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 4 SPIS TRECI

    6.2.2 Pisanie znakw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576.3 Czytanie z pliku i pisanie do pliku . . . . . . . . . . . . . . . . . . . . . . 57

    6.3.1 Czytanie z pliku . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576.3.2 Pisanie do pliku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

    6.4 Operatory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606.4.1 Priorytet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606.4.2 -fixowo operatora . . . . . . . . . . . . . . . . . . . . . . . . . . . 616.4.3 czno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616.4.4 Definiowanie wasnych operatorw . . . . . . . . . . . . . . . . . . 63

    6.5 Pytania i odpowiedzi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

    7 Predefiniowane predykaty 677.1 Sprawdzanie typu termw . . . . . . . . . . . . . . . . . . . . . . . . . . . 677.2 Konstruowanie i dekompozycja termw . . . . . . . . . . . . . . . . . . . . 697.3 Podstawienia, funktor, argument . . . . . . . . . . . . . . . . . . . . . . . 717.4 Rne rnoci, rne rwnoci . . . . . . . . . . . . . . . . . . . . . . . . 717.5 Manipulowanie baz danych . . . . . . . . . . . . . . . . . . . . . . . . . . 737.6 Pytania i odpowiedzi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

    8 Powtarzamy wiadomoci 758.1 O rekurencji raz jeszcze . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

    8.1.1 Sposb 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758.1.2 Sposb 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758.1.3 Sposb 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768.1.4 Sposb 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

    8.2 Akumulator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768.2.1 Przykad z list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768.2.2 Przykad z liczbami . . . . . . . . . . . . . . . . . . . . . . . . . . 77

    8.3 Z gry na d czy od dou do gry? . . . . . . . . . . . . . . . . . . . . . . 788.3.1 Z gry na d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 788.3.2 Z dou do gry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

    8.4 Pytania i odpowiedzi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

    9 Sortowanie 819.1 Sortowanie naiwne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819.2 Sortowanie bbelkowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 849.3 Sortowanie przez wstawianie . . . . . . . . . . . . . . . . . . . . . . . . . . 869.4 Sortowanie przez czenie . . . . . . . . . . . . . . . . . . . . . . . . . . . 879.5 Pytania i odpowiedzi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

    10 Od problemu do jego (efektywnego) rozwizania 9110.1 Rebus i jego pierwsze rozwizanie . . . . . . . . . . . . . . . . . . . . . . . 9110.2 Rozwizanie drugie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9210.3 Rozwizanie trzecie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9310.4 Rozwizanie czwarte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9310.5 Rozwizanie pite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9410.6 Rozwizanie szste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9510.7 Rozwizanie sidme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • SPIS TRECI 5

    11 Efektywny Prolog 9911.1 Czy tylko deklaratywno? . . . . . . . . . . . . . . . . . . . . . . . . . . . 9911.2 Zmniejsza przestrze rozwaa . . . . . . . . . . . . . . . . . . . . . . . . 10011.3 Niech pracuj za nas inni . . . . . . . . . . . . . . . . . . . . . . . . . . . 10111.4 Pracuj na gowie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10311.5 . . . albo odcinaj to co zbdne . . . . . . . . . . . . . . . . . . . . . . . . . 103

    12 Rachunek zda 10512.1 Posta normalna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

    12.1.1 Przeksztacanie do postaci normalnej . . . . . . . . . . . . . . . . . 11012.2 Formua Horna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11212.3 twierdzenie tutu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11212.4 Rezolucja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11212.5 Pytania i odpowiedzi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

    13 wiczenia 11513.1 wiczenie 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

    13.1.1 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11613.1.2 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11613.1.3 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11613.1.4 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11613.1.5 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

    13.2 wiczenie 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11713.2.1 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11713.2.2 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11813.2.3 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11813.2.4 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11813.2.5 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11813.2.6 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11813.2.7 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

    13.3 wiczenie 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11913.3.1 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11913.3.2 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11913.3.3 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11913.3.4 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11913.3.5 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11913.3.6 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11913.3.7 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11913.3.8 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11913.3.9 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12013.3.10Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12013.3.11Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

    13.4 wiczenie 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12113.4.1 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12113.4.2 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12113.4.3 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12113.4.4 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12113.4.5 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 6 SPIS TRECI

    13.4.6 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12113.5 wiczenie 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

    13.5.1 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12213.5.2 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12213.5.3 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12213.5.4 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12213.5.5 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

    13.6 wiczenie 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12313.6.1 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12313.6.2 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

    13.7 wiczenie 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12413.7.1 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12413.7.2 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

    13.8 wiczenie 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12513.8.1 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12513.8.2 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12513.8.3 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

    13.9 wiczenie 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12713.9.1 Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

    14 Rozwizania wicze 12914.1 Odpowiedzi do zadania 13.1 . . . . . . . . . . . . . . . . . . . . . . . . . . 130

    14.1.1 Odpowiedzi do zadania 13.1.1 . . . . . . . . . . . . . . . . . . . . . 13014.1.2 Odpowiedzi do zadania 13.1.2 . . . . . . . . . . . . . . . . . . . . . 13014.1.3 Odpowiedzi do zadania 13.1.3 . . . . . . . . . . . . . . . . . . . . . 13114.1.4 Odpowiedzi do zadania 13.1.4 . . . . . . . . . . . . . . . . . . . . . 13114.1.5 Odpowiedzi do zadania 13.1.5 . . . . . . . . . . . . . . . . . . . . . 132

    14.2 Odpowiedzi do zadania 13.2 . . . . . . . . . . . . . . . . . . . . . . . . . . 13314.2.1 Odpowiedzi do zadania 13.2.1 . . . . . . . . . . . . . . . . . . . . . 13314.2.2 Odpowiedzi do zadania 13.2.2 . . . . . . . . . . . . . . . . . . . . . 13314.2.3 Odpowiedzi do zadania 13.2.3 . . . . . . . . . . . . . . . . . . . . . 13314.2.4 Odpowiedzi do zadania 13.2.4 . . . . . . . . . . . . . . . . . . . . . 13314.2.5 Odpowiedzi do zadania 13.2.5 . . . . . . . . . . . . . . . . . . . . . 13414.2.6 Odpowiedzi do zadania 13.2.6 . . . . . . . . . . . . . . . . . . . . . 13414.2.7 Odpowiedzi do zadania 13.2.7 . . . . . . . . . . . . . . . . . . . . . 134

    14.3 Odpowiedzi do zadania 13.3 . . . . . . . . . . . . . . . . . . . . . . . . . . 13514.3.1 Odpowiedzi do zadania 13.3.1 . . . . . . . . . . . . . . . . . . . . . 13514.3.2 Odpowiedzi do zadania 13.3.2 . . . . . . . . . . . . . . . . . . . . . 13514.3.3 Odpowiedzi do zadania 13.3.3 . . . . . . . . . . . . . . . . . . . . . 13514.3.4 Odpowiedzi do zadania 13.3.4 . . . . . . . . . . . . . . . . . . . . . 13514.3.5 Odpowiedzi do zadania 13.3.5 . . . . . . . . . . . . . . . . . . . . . 13514.3.6 Odpowiedzi do zadania 13.3.6 . . . . . . . . . . . . . . . . . . . . . 13514.3.7 Odpowiedzi do zadania 13.3.7 . . . . . . . . . . . . . . . . . . . . . 13514.3.8 Odpowiedzi do zadania 13.3.8 . . . . . . . . . . . . . . . . . . . . . 13514.3.9 Odpowiedzi do zadania 13.3.9 . . . . . . . . . . . . . . . . . . . . . 13614.3.10Odpowiedzi do zadania 13.3.10 . . . . . . . . . . . . . . . . . . . . 13614.3.11Odpowiedzi do zadania 13.3.11 . . . . . . . . . . . . . . . . . . . . 136

    14.4 wiczenie 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • SPIS TRECI 7

    14.4.1 Odpowiedzi do zadania 13.4.1 . . . . . . . . . . . . . . . . . . . . . 13714.4.2 Odpowiedzi do zadania 13.4.2 . . . . . . . . . . . . . . . . . . . . . 13714.4.3 Odpowiedzi do zadania 13.4.3 . . . . . . . . . . . . . . . . . . . . . 13714.4.4 Odpowiedzi do zadania 13.4.4 . . . . . . . . . . . . . . . . . . . . . 13714.4.5 Odpowiedzi do zadania 13.4.5 . . . . . . . . . . . . . . . . . . . . . 13714.4.6 Odpowiedzi do zadania 13.4.6 . . . . . . . . . . . . . . . . . . . . . 137

    14.5 wiczenie 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13814.5.1 Odpowiedzi do zadania 13.5.1 . . . . . . . . . . . . . . . . . . . . . 13814.5.2 Odpowiedzi do zadania 13.5.2 . . . . . . . . . . . . . . . . . . . . . 13814.5.3 Odpowiedzi do zadania 13.5.3 . . . . . . . . . . . . . . . . . . . . . 13814.5.4 Odpowiedzi do zadania 13.5.4 . . . . . . . . . . . . . . . . . . . . . 13814.5.5 Odpowiedzi do zadania 13.5.5 . . . . . . . . . . . . . . . . . . . . . 138

    14.6 wiczenie 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13914.6.1 Odpowiedzi do zadania 13.6.1 . . . . . . . . . . . . . . . . . . . . . 13914.6.2 Odpowiedzi do zadania 13.6.2 . . . . . . . . . . . . . . . . . . . . . 140

    14.7 wiczenie 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14214.7.1 Odpowiedzi do zadania 13.7.1 . . . . . . . . . . . . . . . . . . . . . 14214.7.2 Odpowiedzi do zadania 13.7.2 . . . . . . . . . . . . . . . . . . . . . 142

    14.8 wiczenie 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14314.8.1 Odpowiedzi do zadania 13.8.1 . . . . . . . . . . . . . . . . . . . . . 14314.8.2 Odpowiedzi do zadania 13.8.2 . . . . . . . . . . . . . . . . . . . . . 14314.8.3 Odpowiedzi do zadania 13.8.3 . . . . . . . . . . . . . . . . . . . . . 143

    14.9 wiczenie 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14414.9.1 Odpowiedzi do zadania 13.9.1 . . . . . . . . . . . . . . . . . . . . . 144

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 8 SPIS TRECI

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • Wstp

    Niniejszy podrcznik stanowi sformalizowan wersj notatek jakie sporzdzaem dla sie-bie prowadzc zajcia Programowanie w logice. Cel jaki przywieca mi, to ch poka-zania, e wiat jzykw programowania nie koczy si na programowaniu obiektowym.Wykorzystanie jzyka logiki do opisu otaczajcej nas rzeczywistoci odwzorowywanej wrodowisku komputerowym, daje nam zupenie inn jako i uczy cakowicie odmiennegospojrzenia na problem programu i jego kodu. I cho przydatno takich jzykw moeby dyskusyjna1 to jednak wydaje mi si, e ich elementarna znajomo jest koniecznadla osb, ktre chc zosta informatykiem.

    W prezentowanym materiale gwny nacisk pooony jest na zdobycie praktycznejumiejtnoci posugiwania si takim jzykiem i jego czucia, ni teorii programowaniaw logice. Niemniej pewna cz materiau powicona jest take zagadnieniom naturyteoretycznej. Wybranym jzykiem jest Prolog a wszystkie przykady zostay przetesto-wane przy uyciu jednej z jego najbardziej popularnych wersji SWI-Prolog2 w wersji5.6.59.

    Ze wzgldu na form zaj, cao materiau podzielona zostaa na dwie zasadni-cze cz: wykadow i wiczeniow. Materia kadej z czci powinien wystarczy doprzeprowadzenia semstralnych zaj. Cz wykadowa obejmuje rozdziay ???? i po-wicona jest nastpujcym zagadnieniom

    a

    Cz wiczeniowa zawiera materia czy to do samodzielnej pracy, czy te nadajcysi do przeprowadzenia zaj na pracowni komputerowej. Zbir zada sukcesywnie jestposzerzany, ale nie jest to wcale takie atwe. Wbrew pozorom trudno jest znale zadaniarne (na tyle, aby ich rozwizanie wymagao przynajmniej w pewnej ich czci innegopodejcia ni zadania poprzednie) i zarazem na tyle atwe aby dao si je w prostysposb wytumaczy. Dobrze przy tym aby zadania nie byy cakiem abstrakcyjnymmanipulowaniem symbolami w stylu sztuka dla sztuki. Daltego jeli ktokolwiek czytajcten podrcznik wpadnie na jakie nowe zadanie albo alternatywne rozwizanie dla tychju podanych, to z wielk chci je zamieszcze.

    Na zakoczenie pragn podzikowa (nielicznym niestety) studentom, ktrzy z jednejstrony wykazali zainteresowanie przedmiotem, z drugiej za wzbogacili ten podrcznik aprzede wszystkim:

    Pani Magdalenie Zych za opracownie bardzo wyczerpujcych odpowiedzi do pytajakie stawiam na koniec kadego rozdziau (wykadu).

    1Wynika to zwykle z problemw zwizanych z wykorzystaniem jzyka logicznego w realnej aplikacji.2www.swi-prolog.org

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • ii ROZDZIA 0. WSTP

    Panu Krzysztofowi Jastrzbskiemu za mozolne i niestrudzone rozwizywanie zadajakie stawiaem na wiczeniach.

    Piotr Fulmaskid, 2008

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • Rozdzia 1

    Podstawy

    1.1 Zdumiewajcy pocztek

    Ju sama nazwa jzyka Prolog niesie w sobie informacj o jego przeznaczeniu. Sowoprolog pochodzi bowiem od sformuowania programmation en logique co w jzyku fran-cuskim oznacza wanie programowanie w logice. Prolog zosta stworzony w 1971 rokuprzez Alaina Colmeraurera i Phillipea Roussela. Cho jego teoretyczne podstawy sta-nowi rachunek predykatw pierwszego rzdu, to jednak ogranicza si tylko do klauzulHorna (o czym wicej powiemy w rozdziale ??). Jeszcze w pierwszych latach XXI wiekuby bardzo chtnie uywany w wielu programach zwizanych z

    logik matematyczn (automatyczne dowodzenie twierdze); przetwarzaniem jzyka naturalnego; symbolicznym rozwizywaniem rwna; sztuczn inteligencj; przechowywaniem i przetwarzaniem danych.

    I cho powoli jego miejsce zajmuj wygodniejsze narzdzia jak na przykad silniki regu-owe (o czym powiemy w rozdziale ??), to wci stanowi wspaniay model dydaktyczny.

    Najwaniejsz i zarazem czsto najbardziej zaskakujc i zdumiewajc rzecz zwi-zan z Prologiem jest to, e

    Pisanie programu w Prologu nie polega na opisywaniu algorytmu!

    Jak to? Przecie od lat, z mozoem i w wielkim trudzie wpajano nam do gowy, e zanimzaczniemy pisa program to musimy uoy odpowiedni algorytm. Gdy si ju tego na-uczylimy i przyjlimy za pewnik, nagle okazuje si, e wcale tak nie musi by. Niestetybardzo trudno jest przesta myle algorytmicznie o problemie. Jest to silniejsze od nas,bo tak nas nauczono. Tym czasem w Prologu istotne jest co zupenie innego. Oto bo-wiem zamiast opisywa algorytmu, opisujemy obiekty zwizane z problemem i relacjepomidzy tymi obiektami. Std wanie Prolog czsto bywa okrelany jako jzyk opi-sowy i deklaratywny. Oznacza to, e implementujc rozwizanie jakiego problemunie podajemy jak go rozwiza (jak to ma miejsce w imperatywnych jzykach progra-mowania tj. C lub Java) ale okrelamy czego on dotyczy uywajac do tego faktw iregu. Rol Prologu jest wywnioskowanie rozwizania na podstawie podanych przeznas informacji.

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 2 ROZDZIA 1. PODSTAWY

    1.2 Obiekty i relacje

    Programowanie w Prologu polega na definiowaniu obiektw i okrelaniu wicychich relacji. Odmienne jednake od tradycyjnego (tzn. wystpujcego w klasycznymprogramowaniu obiektowym) jest pojmowanie obiektu.

    1.2.1 Obiekt klasyczny

    Pomimo, i zajmujemy si Prologiem to aby uwiadomi sobie co jest w nim tak od-miennego od innych jzykw, powimy troch miejsca na przypomnienie, czym jestklasyczny obiekt, znany z takich jzykw jak np. C++ czy Java. W tym ujciu obiektto podstawowe pojcie wchodzce w skad paradygmatu obiektowoci w analizie i pro-jektowaniu oprogramowania oraz w programowaniu. Jego koncepcja ma uatwi cyfrowreprezentacj realnych obiektw. Czym charakteryzuj si rzeczywiste obiekty?

    Obiekty jakie otaczj nas w rzeczywistym wiecie posiadaj dwie istotne cechy: stanw jakim w danej chwili si znajduj1 oraz zachowanie jakie dla nich jest typowe. I takpsy maj swj stan (kolor, wag, s godne lub najedzone. . . ) oraz zachowanie (szczeka-nie, bieg, leenie, merdanie ogonem. . . ). Take telewizory maj swj stan (wczony lubwyczony, gono, numer programu. . . ) oraz zachowanie (zmiana gonoci lub pro-gramu, wczenie, wyczenie. . . ). Prawidowe okrelenie stanu i zachowania ma bardzodue znaczenie dla dalszego sposobu i komfortu obsugi obiektu w programie.

    Obiekt w ujciu jzykw obiektowych jest bardzo podobny do obiektw wiata rze-czywistego: take posiada stany (cechy) i przypisane jemu zachowanie. Taki obiektprzechowuje swoje stany w zmiennych zwanych polami a wpyw na jego zachowaniemamy za porednictwem funkcji, nazywanych te metodami. Metody operujc na po-lach dostarczaj jednoczenie podstawowych mechanizmw komunikacji obiektobiekt.Zasada ukrywania stanw wewntrznych obiektu i interakcja z nim tylko poprzez do-brze zdefiniowany zbir metod znana jest pod nazw enkapsulacji danych i stanowifundamentaln zasad programowania zorientowanego obiektowo.

    Kady utworzony przez programist obiekt jest instancj pewnej klasy. W tymujciu, klasa zdefiniowana przez programist, staje si nowym typem, ktry moe byuywany na rwni z typami wbudowanymi. Jako przykad takiej klasy rozwamy klasPunkt umoliwiajc utworzenie dowolnej iloci obiektw opisujcych (rne) punkty.

    class Punkt{private:double x;double y;

    public:Punkt(double x, double y);void Przesun(Wektor w);

    };

    Jeli ponad to zaoymy, e mamy dostpn klas Wektor, wwczas staje si moliwenapisanie kodu jak poniej

    Punkt p(1.0,2.0);

    1Lub cechy jakie posiadaj.

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 1.2. OBIEKTY I RELACJE 3

    Wektor w(2.5,-1.5);

    p.Przesun(w);

    Posumowujc:

    Programowanie zorientowane obiektowo (ang. OOP, object-oriented programming)to paradygmat (sposb) programowania posugujcy si pojciem obiektu jakometody reprezentacji danych w programie.

    Kady obiekt, bdcy instancj pewnej klasy, posiada zbir cech (bdcych zmien-nymi pewnych typw) go opisujcych oraz zbir metod (funkcji) ktrych wywoaniena rzecz tego obiektu ma sens.

    W tym ujciu, klasa zdefiniowana przez programist, staje si nowym typem, ktrymoe by uywany na rwni z typami wbudowanymi.

    Z OOP nierozerwalnie zwizane s pojcia enkapsulacji danych, dziedziczenia, po-limorfizmu.

    Wiedzc czym s, najlepiej chyba wszystkim znane, obiekty z jzykw OOP wystar-czy teraz powiedzie, e obiekt Prologowy nie jest takim wanie obiektem nawet wnajmniejszej czci. Jaki wic jest?

    1.2.2 Obiekt w Prologu

    Obiekt w sensie Prologu jest czym, co moemy nazwa bytem. Nie definiujemy z czegosi on skada i co mona z nim zrobi (co ma miejsce w OOP), ale jaki jest. Dodat-kowo, dla kadego obiektu definiujemy relacje jakim obiekt ten podlega. Przy pomocyobiektw opisujemy interesujcy nas wycinek wiata. Dziaanie programu prologowegoobjawia si moliwoci stawiania pyta zwizanych z uprzednio opisanym wiatem.

    Najprostszym sposobem opisu wiata (problemu), jest podanie faktw z nim zwiza-nych, jak na przykad:

    ciezszy(pomarancz,jablko).ciezszy(jablko,mandarynka).ciezszy(arbuz,pomarancz).ciezszy(jablko,winogrono).

    Powysze fakty stwierdzaj, e

    ciezszy(pomarancz,jablko). pomaracz jest cisza od jabka, ciezszy(jablko,mandarynka). jabko jest cisze od mandarynki, itd.

    Tak wic powyej okrelilimy kilka obiektw (pomarancz, jablko, itd) i powizalimyje midzy sob relacj ciezszy wyraajc, ktry z obiektw jest ciszy od innych.Istotne jest to, e nadal nie jest nam znana masa adnego z obiektw one po prostunie posiadaj cech.

    Okazuje si zdumiewajce, e ju nawet jeden fakt jest poprawnym (przynajmniejskadniowo) programem Prologu. Po uruchomieniu takiego programu, moemy zada-wa pytania zwizane z rzeczywistoci jak opisuje

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 4 ROZDZIA 1. PODSTAWY

    ?- ciezszy(pomarancz,jablko).Yes

    W ten oto sposb otrzymujemy twierdzc odpowiedz na pytanie: Czy pomaracz jestcisza od jabka?. Bdc precyzyjniejszym, to pytanie brzmi: Czy wiadomo co na temattego, e pomaracz jest cisza od jabka?. Jest to istotne rozrnienie, gdy wwczasreakcj

    ?- ciezszy(winogrono,arbuz).No

    naley odczytywa jako: Nic nie wiadomo na temat tego, e winogrono jest cisze odarbuza. Nie oznacza to jednak, e tak nie jest. Taka interpretacja jest waciwsza, copokazuje kolejny przykad

    ?- ciezszy(arbuz,winogrono).No

    Z podanych faktw, przez przechodnio i znajomo pojcia ciaru moemy wywnio-skowa, e odpowied powinna by twierdzca, wedug rozumowania

    poniewa prawd jest, e

    ciezszy(arbuz,pomarancz)

    i prawd jest, e

    ciezszy(pomarancz,jablko)

    i prawd jest, e

    ciezszy(jablko,winogrono).

    czyli

    arbuz > pomarancz > jablko > winogrono

    inaczej

    arbuz > ... > winogrono

    wic prawd jest, e

    ciezszy(arbuz,winogrono)

    Jednak Prolog nie wie, e w stosunku do relacji ciezszy moe przechodnio stosowa,w zwizku z czym, w wietle znanych faktw i zwizkw, udziela odpowiedzi ne-gatywnej. W ten oto sposb dochodzimy do sytuacji, gdy musimy poinformowa Prologo pewnych relacjach, czyli okreli reguy.

    Zajmijmy si zatem relacj przechodnioci i utworzeniem dla niej odpowiednich regu.W matematyce relacja (dwuargumentowa) R na zbiorze A, co zapisujemy R A2 jest

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 1.2. OBIEKTY I RELACJE 5

    przechodnia, gdy dla wszystkich elementw a, b, c A, jeeli elementy (a, b) s w relacjiR i elementy (b, c) s w relacji R, to take elementy (a, c) s w relacji R. Jako przykadytakich relacji mona poda np. relacje wikszoci, relacja zawierania zbiorw czy relacjby rodzestwem. Przechodnia nie jest natomiast relacja rnoci, relacja by rodzicemczy by przyjacielem. W przypadku rozwaanej przez nas relacji wystarczy doda takregu2

    ciezszy(X,Y) :- ciezszy(X,Z),ciezszy(Z,Y).

    W powyszej regule symbol :- oznacza jeli (jeli zachodzi prawa strona to zachodzi lewa)a symbol przecinka (,) peni rol operatora logicznego i (AND). Symbole X, Y oraz Z snazwami zmiennych (w Prologu nazwa zmiennej rozpoczyna si od duej litery).

    Umieszczajc fakty i regu w jednym pliku (owoce.pl) moemy teraz przetestowadziaanie programu. Uruchamiamy zatem interpreter

    fulmanp@fulmanp-laptop-fs12:~$ swiplWelcome to SWI-Prolog (Multi-threaded, Version 5.6.47)Copyright (c) 1990-2007 University of Amsterdam.SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,and you are welcome to redistribute it under certain conditions.Please visit http://www.swi-prolog.org for details.

    For help, use ?- help(Topic). or ?- apropos(Word).

    i wczytujemy program

    ?- [owoce].% t compiled 0.00 sec, 1,176 bytes

    Yes

    Zrbmy test na znajomo elementarnych faktw:

    ?- ciezszy(pomarancz,jablko).More? [ENTER]

    Yes

    Chwilowo pomijamy znaczenie komunikatu More? i naciskamy ENTER gdy si on pokae.Wszystko si zgadza, zatem pora na test przechodnioci:

    ?- ciezszy(arbuz,winogrono).More? [ENTER]

    Yes

    Tym razem odtrzymalimy odpowied zgodn z oczekiwaniem. Moemy jednak dowie-dzie si znacznie wicej, zadajc np. pytanie od jakich obiektw jest ciszy arbuz:

    2Regua ta nie do koca jest poprawna i zasadniczo problem powinien zosta rozwizany w innysposb, ale na tym etapie poznawania Prologa jest to rozwizanie akceptowalne.

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 6 ROZDZIA 1. PODSTAWY

    ?- ciezszy(arbuz,X).

    X = pomarancz [;]

    X = jablko [;]

    X = mandarynka [;]

    X = winogrono [;]ERROR: Out of local stack

    Po wywietleniu kadej z moliwoci, Prolog czeka na nasz decyzj: nacinicie ENTERoznacza zakoczenie poszukiwania alternatywnych odpowiedzi, rednik (;) oznacza kon-tynuowanie poszukiwania. Niemiy komunikat pojawiajcy si na kocu3 naley w tymprzypadku odczyta jako nie wiadomo nic o innych moliwociach (obiektach). Symbolrednika (;), zgodnie z intuicj, czytamy jako lub (OR). Z operatorw logicznych moemyskorzysta take podczas formuowania zapytania, np. czy istniej owoce X, Y takie, earbuz jest ciszy od X i jednoczenie X jest ciszy od Y :

    ?- ciezszy(arbuz,X),ciezszy(X,Y).

    X = pomarancz,Y = jablko [;]

    X = pomarancz,Y = mandarynka [ENTER]

    Yes

    1.3 Program w Prologu

    1.3.1 Struktura i skadnia

    Wiedzc ju jak naley rozumie pojcie obiektu i regu go opisujcych, moemy spr-bowa w bardziej kompletny sposb przedstawi struktur i skadni programu Prologo-wego.

    Przede wszystkim, powtrzmy to jeszcze raz, programowanie w Prologu polega nadefiniowaniu obiektw i okrelaniu wicych ich relacji. Zatem przystpujc do roz-wizania jakiego problemu musimy bardzo uwanie si zastanowi

    1. z jakimi obiektami mamy do czynienia,

    2. jakie relacje (zwizki) cz wytypowane przez nas obiekty.

    Musimy przy tym zdawa sobie jasno spraw z kilku faktw.

    1. Z punktu widzenia jzyka, obiekty nie s rozrnialne semantycznie. Oznacza to,e obiekt slon i slonia w poniszych faktach

    3Pomijamy na tym etapie powd jego pojawienia si.

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 1.3. PROGRAM W PROLOGU 7

    jestDuzy(slon).lubi(zosia,slonia).

    s rnymi obiektami, pomimo tego, e my wiemy i s tym samym.

    2. Nie wszystkie relacje jawnie okrelaj wszystkie obiekty, ktrych dotycz.

    brakuje mi przykladu

    3. Wybr formy relacji (reguy) powinien by wystarczajco precyzyjny aby mg bypotraktowany jak definicja w problemie jaki rozwizujemy.

    Praca z Prologiem skada si zwykle z nastpujcych etapw:

    1. Definiowanie obiektw poprzez definiowanie faktw dotyczcych obiektw i zwiz-kw midzy nimi.

    2. Definiowanie regu dotyczcych obiektw i zwizkw midzy nimi.

    3. Zapytania o obiekty i zwizki midzy nimi.

    Podczas zapisywania programu4 stosujemy nastpujc konwencj.

    Nazwy relacji i obiektw musz zaczyna si maymi literami. Nazwy rozpoczynajce si od duej litery oznaczaj zmienne. Najpierw zapisujemy relacj, a potem, rozdzielone przecinkami i ujte w nawias

    okrgy, obiekty ktrych ona dotyczy.

    Nazwy obiektw wystpujcych w nawiasach nazywamy argumentami. Nazw relacji znajdujcej si przed nawiasem nazywamy predykatem. Nie mona jako predykatu uy zmiennej. Innymi sowy, nie mona si dowiedzie

    jaka relacja czy obiekty jas i malgosia

    X(jas,malgosia).

    Fakt i regu koczymy znakiem kropki. Kolejno obiektw umieszczonych w nawiasie jest dowolna, ale trzeba stosowa j

    konsekwentnie. O ile bowiem dobrze znanym faktem jest to, e Ala lubi swojegokota, to nie oznacza to, e kot ten lubi Al.

    Zbir faktw i regu nazywamy baz danych. Skadnia reguy jest nastpujca

    :- .

    4Kod programu jest zwykym plikiem tekstowym z rozszerzeniem pl

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 8 ROZDZIA 1. PODSTAWY

    co moemy czyta jako

    lewaCzesc zachodzi (jest prawd), gdy zachodzi prawaCzesc (jest prawda),

    gdzie

    to predykat i ewentualne argumenty umieszczone w nawiasachokrgych, np.

    lubi(X,Y)silnia(0,X)

    to jedno lub wicej wyrae atomowych poczonych opera-torami logicznymi: i (,) oraz lub (;) i poprzedzonych ewentualnie operatoremnegacji (\+). Wyraenie atomowe w tym kontekcie to wyraenie, dla kt-rego mona obliczy warto logiczn, a ktre nie moe by ju rozoone nawyraenia prostsze, np.:

    N>0A is B-1silnia(N,X)\+ lubi(malgosia,X)

    1.3.2 Praca z programem zapytania

    Praca z programem Prologowym take odbywa si inaczej ni w innych jzykach progra-mowania. Raczej trudno mwi o uruchamianiu programu i jego dziaaniu jako samo-dzielnej i niezalenej aplikacji, gdy programy Prologu z natury s raczej interakcyjne.Bardziej adekwatnym okreleniem zamiast uruchamianie wydaje si by formuowaniezapyta lub te interakcyjny tryb zapytanieodpowied5.

    Zapisany program wczytujemy poleceniem (znaki ?- s tzw. znakiem zachty)

    ?- [plikBezRozszerzenia].

    i od tego momentu moemy formuowa zapytania, np.

    ?- posiada(piotr,ksiazka).

    Zapytanie to, w jzyku naturalnym brzmiaoby

    Czy Piotr ma ksik?

    Na potrzeby przetwarzania przez Prolog naley czyta je jednak troch inaczej

    Czy istnieje fakt mwicy, e Piotr ma ksik?

    Prolog przeszuka ca dostpn baz wiedzy (w postaci faktw i regu) i jeli zosta-nie znalezione co co pasuje do zapytania i zwraca przy tym warto logiczn prawda,wwczas zostanie zwrcona odpowied yes; w przeciwnym razie no. Raz jeszcze zazna-czamy, e no nie oznacza nie, ale nie wiem. Sam proces przeszukiwania, o ktrym

    5S to moje propozycje na okrelenie tego z czym mamy do czynienia. Ewentualne zamienniki smile widziane.

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 1.4. PYTANIA I ODPOWIEDZI 9

    powiemy sobie w dalszej czci (patrz rozdzia ?? tutu), odbywa si linia po linii, czylifakty i reguy rozpatrywane s w kolejnoci ich umieszczenia w pliku.

    Zamiast szuka odpowiedzi na pytanie

    Czy Piotr ma ksik?

    moemy chcie zapyta

    Co ma Piotr?

    co w jzyku Prologu bardziej naley czyta jako

    Jeli Piotr ma X, to X jest tym czego szukam.

    ?- posiada(piotr,X).

    Majac wicej faktw

    lubi(jas,piernik).lubi(jas,malgosia).lubi(malgosia,cukierek).lubi(malgosia,piernik).

    moemy konstruowa zapytania zoone, np.

    ?- lubi(jas,malgosia), lubi(malgosia,jas).

    czyli

    Czy prawd jest, e Ja lubi Magosi i Magosia lubi Jasia?

    lub

    ?- lubi(jas,X), lubi(malgosia,X).

    czyli

    Szukam tego wszystkiego co lubi zarwno Jas jak i Magosia.

    Odpowied na pytanie o to co lubi Ja lub Magosia uzyskamy zapytaniem

    ?- lubi(jas,X); lubi(malgosia,X).

    1.4 Pytania i odpowiedzi

    Pytanie 1.1. Co oznacza programowanie w logice? Programowanie w logice opierasi na rachunku kwantyfikatorw (tzn. rachunku predykatw pierwszego rzdu). Podajczbir predykatw i podstawiajc do nich stae programista tworzy baz faktw, nastpnieokrelajc zwizki logiczne midzy nimi otrzymuje zbir regu. Jednym z jzykw takrozumianego programowania jest Prolog. Praca z Prologiem moe zatem polega na:

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 10 ROZDZIA 1. PODSTAWY

    uzyskiwaniu odpowiedzi TAK/NIE na pytanie o prawdziwo pewnego zdania6. Z uwagina to, e rachunek kwantyfikatorw nie jest rozsztrzygalny odpowied negatywnaoznacza, e

    podane zdanie jest rozstrzygalne i nieprawdziwe lub

    zdanie jest nierozstrzygalne;

    uzyskiwaniu odpowiedzi na pytanie o ekstensj funkcji zdaniowej7 przy czym zwra-cana jest odp. NIE jeli ekstensja funkcji jest pusta.

    Pytanie 1.2. Jak naley rozumie pojcie obiektu wystpujce w Prologu?Tak samo jak w OOP? Pojcie obiekt w jzykach zorientowanych obiektowo oznaczajednoznacznie identyfikowaln (np. poprzez adres) struktur zawierajc pewne parametryjako dane i zbir operacji/procedur/funkcji okrelonych na tych parametrach. Wartociparametrw okrelaj stan obiektu, ktry moe zmienia si w trakcie pracy programu.W Prologu natomiast definicja obiektu jest definicj operacyjn8: podaje si zbir predy-katw spenianych przez definiowane obiekty.

    Uwaga: Obiekty mog pozostawa we wzajemnych zalenociach wyraanaych za pomocimplikacji, ktrej poprzednikiem i nastpnikiem s okrelone formuy zdaniowe. Moemyzatem definiowa jedne obiekty poprzez inne w ten sposb, e z prawdziwoci pewnychpredykatw okrelonych na znanych ju obiektach i na tym definiowanym wynika praw-dziwo jakiego predykatu okrelonego (midzy innymi) na obiekcie definiowanym.

    Pytanie 1.3. Co nazywamy relacj, faktem, regu?

    Relacja: zwizek midzy obiektami wyraony za pomoc predykatu przez nie spenianego.Inaczej, mona powiedzie, e predykat okrelony na pewnym zbiorze zmiennychjest konkretn, nazwan relacj midzy obiektami bdcymi wartociami zmiennychz jego dziedziny. Np.: predykat p(A,B,C,D) prawdziwy dla wektorw (a,b,c,d);(e,f,g,h) i nieprawdziwy dla (a,f,c,h) wyznacza zarwno relacj midzy obiektami(a,b,c,d); (e,f,g,h) ale take midzy (a,f,g,h)9 .

    Fakt: zdanie otrzymane przez wstawienie do okrelonego w programie predykatu war-toci zmiennych (a zatem obiektw), dla ktrych jest ono prawdziwe. Podana tudefinicja faktu odnosi go cakowicie do formlizmu stosowanego w Prologu, w istociefakt ma odzwierciedla pewien elementarny fragment rzeczywistoci modelowanej wprogramie.

    Regua: zdanie prawdziwe wice implikacj obiekty i relacje wchodzce w jego skad.

    6Zdanie powinno by konsystentne (konsystentny wewntrznie spjny lub zgodny z czym) w formiezapsiu z baz a jego dziedzina musi si zawiera w zbiorze staych wystpujcych w bazie.

    7Ekstensja funkcji zdaniowej zakres funkcji zdaniowej wyznaczony przez zbir przedmiotw, ktrychnazwy wstawione w miejsce zmiennych wolnych zmieniaj t funkcje w zdanie prawdziwe.

    8Definicja operacyjna to taka definicja, w ktrej znaczenie definiowanej nazwy okrelane jest drogpodania czynnoci (operacji) niezbdnych do okrelenia znaczenia tej nazwy.

    9Wana jest take przynalenoci staych do dziedziny predykatu, gdy jak to zostao wspomniane,odpowied negatywna na postawione pytanie zostanie udzielona przez Prolog take wtedy, gdy dla repre-zentowanej przez wstawione do relacji stae rzeczywistoci utworzone zdanie jest nie tyle nieprawdziweco pozbawione sensu.

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • Rozdzia 2

    Skadnia Prologu

    2.1 Termy

    Program Prologu skada si z termw. Wyrniamy cztery rodzaje termw: atomy(ang. atoms), liczby (ang. numbers), zmienne (ang. variables) i termy zoone (ang.compound terms). Atomy i liczby wsplnie okrelane s jako stae (ang. constants).Zbir zoony z atomw i termw zoonych nazywany jest te zbiorem predykatw1.Kady term zapisywany jest jako cig znakw pochodzcych z nastpujcych czterechkategorii:

    due litery: A-Z mae litery: a-z cyfry: 0-9 znaki specjalne: % + - * / \ ~ ^ < > : . ? @ # $ &

    Zbir ten uzupenia znak podkrelenia (_), ktry zwykle traktowany jest jak litera.

    Atomy

    Atom jest cigiem znakw utworzonym z

    maych i duych liter, cyfr i znaku podkrelenia z zastrzeeniem, e pierwszymznakiem musi by maa litera, np.

    jas, a, aLA, x_y_z, abc

    dowolnego cigu znakw ujtego w apostrofy, np.

    To te jest atom

    symboli, np. ?- lub :- .1Tak przyjta terminologia odbiega troch od poj i terminw uywanych w rachunku predykatw

    (nazywanym te rachunkiem predykatw pierwszego rzdu (ang. first order predicate calculus), logikpierwszego rzdu (ang. first-order logic), rachunkiem kwantyfikatorw). Troch wicej na ten tematpowiemy w rozdziale ??.

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 12 ROZDZIA 2. SKADNIA PROLOGU

    Liczby

    W SWI-Prologu dostpne s zarwno liczby cakowite jak i rzeczywiste

    -17, 23, 99.9, 123e-3

    Zmienne

    Zmienna jest cigiem znakw utworzonym z maych i duych liter, cyfr i znaku podkre-lenia z zastrzeeniem, e pierwszym znakiem musi by dua litera lub znak podkrelenia,np.

    X, Kto, _123, X_1_2, _

    Ostatni z wymienionych przykadw, pojedynczy znak podkrelenia, to tak zwana zmiennaanonimowa. Korzystamy z niej zawsze wtedy, gdy interesuje nas tylko czy co jestprawd, ale zupenie nie interesuje nas co, np.

    Czy kto lubi Jasia?

    ?- lubi(_,jas).

    Naley pamita, e wielokrotnym wystpieniom zmiennej anonimowej w jednym wyra-eniu mog by przypisane rne wartoci.

    ?- a(1,2)=a(X,Y).X = 1,Y = 2?- a(1,2)=a(X,X).No?- a(1,2)=a(_,_).Yes

    Termy zoone

    Term zoony, inaczej struktura, to obiekt zoony z innych obiektw, czyli atomw,liczb, zmiennych a take innych termw zoonych. Termy zoone maj posta

    f(arg_1,...,arg_n)

    gdzie arg_1,. . . ,arg_n s termami, natomiast f jest atomem (nazw relacji). Korzystajcz moliwoci zagniedania innych termw w termach zoonych, moemy lepiej opisainteresujcy nas problem. Fakty

    posiada(piotr,auto).posiada(marcin,auto).

    pozwalaj jedynie stwierdzi, e obiekty piotr i marcin zwizane s relacj posiada zobiektem auto, czyli mwic normalnie, Piotr i Marci maj auto. Trudno powiedziejakie to jest auto i czy przypadkiem to nie jest to samo auto. Zapisujc te fakty inaczej

    posiada(piotr,auto(nissan,almera)).posiada(marcin,auto(fiat,punto)).

    maAuto(X) :- posiada(X,auto(_,_)).

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 2.2. KLAUZULE, PROGRAM I ZAPYTANIA 13

    wci mamy moliwo dowiedzenie si czy obaj maj auto, ale jeli bdziemy chcieli, tomoemy zapyta o co bardziej szczegowego, np. marka i model

    ?- maAuto(piotr).Yes?- posiada(piotr,auto(X,Y)).X = nissan,Y = almera

    2.2 Klauzule, program i zapytania

    W rozdziale 1 zawarto elementarne informacje zwizane z programami Prologu, ich skad-ni i struktur. Jak wiemy, program Prologu skada si zasadniczo z dwch rodzai kon-strukcji programistycznych, jeli mona takiego terminu uy. S to fakty i reguy, ktreokrelane s jednym terminem klauzule (ang. clauses).

    Fakty

    Fakty (ang. fact) jest to predykat zakoczony znakiem kropka (.), np.

    lubi(piotr,ciastko).toJuzKoniec.

    Intuicyjnie rozumiany termin fakt jest stwierdzeniem o rozpatrywanych obiektach, ktrebezdyskusyjnie uwaamy za prawdziwe.

    Reguy

    Kada regua (ang. rule) skada si z dwch czci: gowy (ang. head) i ciaa (ang.body). Gowa to jeden predykat, natomiast ciao to jeden lub wicej predykatw roz-dzielonych przecinkami (,) i/lub rednikami (;). Regua koczy si znakiem kropki.Przecinek lub rednik peni rol operatorw logicznych, oznaczajacych odpowiedniokoniunkcj (co zapisywa bdziemy te jako: i, and, &) i alternatyw (co zapisywa b-dziemy te jako: lub, or, |). Z tego te powodu dopuszczalne jest uycie nawiaswokrgych w charakterze elementu grupujcego. Gowa od ciaa oddzielona jest opera-torem :- (gowa jest po lewej stronie operatora).

    a(X,Y) :- b(X,Z), c(Z,Y).nieWiekszy(X,Y) :- mniejszy(X,Y); rowny(X,Y).a(X,Y) :- b(X,Z); (c(X,Y), d(X,Y)).a(X,Y) :- b(X,Z); (c(Y,X); c(X,Z), d(Z,Y)).

    Intuicyjnie rozumiany termin regua jest zbiorem warunkw (ciao) jakie musz by spe-nione aby cel (gowa) zosta speniony (spenienie oznacza w tym przypadku moliwoprzypisania/stwierdzenia dla danego elementu wartoci logicznej prawda).

    Program

    Program w Prologu to uporzdkowany zbir klauzul. Sowo uporzdkowany jest wtym przypadku istotne, gdy kolejno klauzul w pliku rdowym ma istotne znaczenie klauzule rozpatrywane s w kolejnoci wystpowania o czym mona si przekonaporwnujc wyniki dziaania dwch programw

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 14 ROZDZIA 2. SKADNIA PROLOGU

    Program 1 Program 2

    a(b). a(c).a(c). a(d).a(d). a(b).

    ?- a(X). ?- a(X).X = b ; X = c ;X = c ; X = d ;X = d X = b

    Zapytania

    Zapytanie ma tak sam struktur jak ciao reguy i tak jak ono koczy si kropk.Zatwierdzenie zapytania, ktre wpisujemy po znaku zachty ?-, nastpuje po naciniciuklawisza [ENTER]. Naley rozumie to jako zlecenie Prologowi poszukiwania, czy mona,na podstawie podanych faktw i regu, wykaza prawdziwo predykatw tworzcychzapytanie a w konsekwencji i jego samego. Odpowied Yes oznacza, e istnieje taki cigprzeksztace i podstawie, ktry pozwala wykaza prawdziwo zapytania. OdpowiedNo oznacza, e na podstawie wiedzy posiadanej w postaci faktw i regu, nie mona tegowykaza. Nie oznacza to jednak, e tak nie jest.

    Zapytanie nie zawierajce adnej zmiennej, np.

    a(b,c).

    nazywane jest zapytaniem elementarnym (?) (ang. ground query). Oczekiwanodpowiedzi na takie zapytanie jest yes lub no (tak/nie, prawda/fasz). Teoretycznie,zapytania tego typu s znacznie atwiejsze do weryfikacji, gdy czsto wystarczy znaledpowiedni fakt. Dla programu jak poniej

    a(1,2).a(2,3).a(3,4).a(4,5).

    przykadowym elementarnym zapytaniem bdzie

    ?- a(2,3).Yes

    Zapytania zawierajce zmienn nazywane s zapytaniami nieelementarnymi (?) (ang.non-ground query). W tym przypadku, znalezienie odpowiedzi moe zaj wicej czasu.Odpowiedzi oczekiwan na takie zapytanie jest znalezienie waciwego podstawienia dlazmiennych. Przyjrzyjmy si prostemu programowi mnocemu dwie liczby naturalne

    mul(0,_,0).mul(1,X,X).mul(X,Y,R) :- X > 1, X1 is X-1, mul(X1,Y,R1), R is R1 + Y.

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 2.2. KLAUZULE, PROGRAM I ZAPYTANIA 15

    Wystpujc w regule formu X1 is X-1 rozumiemy nastpujco: X1 przyjmuje wartobdc wynikiem wykonania operacji X-1. Powyszy program opiera si na rekurencyjnejdefinicji mnoenia. Ot iloczyn dwch liczb x i y, dla x > 1 definiujemy rekurencyjniejako

    x y = y + (x 1) y.Dla x = 0 albo x = 1 mamy

    x y = 0, dla x = 0,

    x y = y, dla x = 1.Efekty dziaania zgodne s z oczekiwaniem

    ?- mul(4,3,X).X = 12 [ENTER]Yes

    ?- mul(0,3,X).X = 0 [ENTER]Yes

    ?- mul(1,3,X).X = 3 [ENTER]Yes

    ?- mul(4,3,12).More? [ENTER]Yes

    Pierwsze z zapyta zmusza Prolog do dosy dugiego cigu poszukiwa celem znalezieniawaciwej odpowiedzi.

    1. Pocztek obliczania celu dla zapytania mul(4,3,X)., czyli poszukiwanie odpowie-dzi na pytanie: Ile to jest cztery razy trzy?

    2. Zgodnie z definicj rekurencyjn, aby obliczy wynik dla 4 3, naley do wynikuoperacji r1 = 3 3 doda 3. Ale w tym momencie nie mamy wyniku r1. Trzeba gonajpierw obliczy, czyli przechodzimy do kolejnego kroku oblicze.

    3. Aby obliczy wynik dla 33, naley do wyniku operacji r2 = 23 doda 3. Ale w tymmomencie nie mamy wyniku r2. Trzeba go najpierw obliczy, czyli przechodzimydo kolejnego kroku oblicze.

    4. Aby obliczy wynik dla 23, naley do wyniku operacji r3 = 13 doda 3. Ale w tymmomencie nie mamy wyniku r3. Trzeba go najpierw obliczy, czyli przechodzimydo kolejnego kroku oblicze.

    5. Wynik dla 1 3, podany jest jako fakt. Oznacza to, e moemy okreli wynik tegodziaania. Wynosi on 3. Znajc ten wynik, moemy go zwrci do poprzedniegowywoania (majcego miejsce w punkcie 4).

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 16 ROZDZIA 2. SKADNIA PROLOGU

    6. Cofamy si do wywoania z punktu 4. Teraz znamy warto zmiennej r3 (zostaaona obliczona przez wywoanie z punktu 5) i moemy dziki temu obliczy wynikdla 2 3 = r3 + 3 = 6. Wynik ten przekazujemy do wywoania poprzedzajcego(punkt 3).

    7. Cofamy si do wywoania z punktu 3. Teraz znamy warto zmiennej r2 (zostaaona obliczona przez wywoanie z punktu 4) i moemy dziki temu obliczy wynikdla 3 3 = r2 + 6 = 9. Wynik ten przekazujemy do wywoania poprzedzajcego(punkt 2).

    8. Cofamy si do wywoania z punktu 2. Teraz znamy warto zmiennej r1 (zostaaona obliczona przez wywoanie z punktu 3) i moemy dziki temu obliczy wynikdla 4 3 = r1 + 9 = 12. Wynik ten przekazujemy do wywoania poprzedzajcego(punkt 1).

    9. Cofamy si do wywoania z punktu 1. Poszukiwanym wynikiem jest X=12.

    Opisane drzewo wywoa wyglda nastpujco

    mul(4,3,X)|3 + mul(3,3,X). |. 3 + mul(2,3,X). . |. . 3 + mul(1,3,X). . . |. . . X=3. . . |. . 3 + 3. . |. . X=6. . |. 3 + 6. |. X=9. |3 + 9|X=12

    Jednak nie zawsze musi by tak prosto zapytanie wygldajce jak zapytanie elemen-tarne, moe te pociga za sob znaczn ilo operacji i oblicze, co pokazuje ostatniez zapyta, tj. mul(4,3,12).. W istocie, pociga ono za sob identyczn sekwencjwywoa jak dla zapytania pierwszego.

    2.3 Pytania i odpowiedzi

    Pytanie 2.1. Czym sa w Prologu stae, zmienne, struktury? Podaj przykad.

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 2.3. PYTANIA I ODPOWIEDZI 17

    staa: konkretny obiekt (np: a, kowalski, 65748) lub konkretna relacja (litera, nazwisko,liczba, :- ). Stae dziel si na:

    liczby; atomy (s zbudowane z dowolnych symboli ewentualnie ujtych w pojedynczycudzysw przy czym zawsze zaczynaj si ma liter);

    zmienna: relacja moe by rozumiana jako funkcja okrelona na pewnym zbiorze obiek-tw. Wwczas przez zmienn rozumiemy dowolny ale nie ustalony element z dzie-dziny jakiej relacji. Nazwy zmiennych s atomami rozpoczynajcymi si zawszewielk liter. Np.: wemy relacj student/2, ktra jest prawdziwa jeli argumen-tami s nazwisko studenta i nazwa przedmiotu na egzaminie z ktrego ciga.Wstawiajc do niej zmienne (Kowalski, Origami) otrzymamy predykat prawdziwydla par utworzonych przez konkretne nazwisko i odpowiadajcy mu przedmiot(y).Jeli baz programu jest zbir:

    student(a,teoria_pola).student(b,mechanika_kwantowa).student(c,wychowanie_fizyczne).student(d,szkolenie_bhp).student(d,geometria_rniczkowa).

    to w wyniku ledztwa przeprowadzonego w Prologu otrzymamy:

    1 ?- student(Kowalski,Origami).

    Kowalski = a,Origami = teoria_pola ;

    Kowalski = b,Origami = mechanika_kwantowa ;

    Kowalski = c,Origami = wychowanie_fizyczne ;

    Kowalski = d,Origami = szkolenie_bhp ;

    Kowalski = d,Origami = geometria_rniczkowa ;

    No2 ?-

    Istnieje szczeglny typ zmiennej tzw. zmienna anonimowa, oznaczana znakiempodkrelenia (_) ktrej uycie w zapytaniu np.:

    ?- pytanie(_,co).

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 18 ROZDZIA 2. SKADNIA PROLOGU

    powoduje uzyskanie odpowiedzi TAK/NIE na pytanie czy istnieje w bazie staaspeniajca relacj pytanie jednoczenie ze sta co? (Innymi sowy: czy ist-nieje w bazie staa bdca w relacji pytanie z co?).

    struktura: majc zdefiniowane pewne obiekty moemy, traktujc je jak stae, zdefinio-wa nowe, zoone z nich obiekty nazywane strukturami. Kontynuujc przykadkryminalny, okrelmy relacj wykroczenie/2 ktra przyjmuje za argumenty rok po-penienia wykroczenia i pozycj niegodziwca na spoecznej drabinie U; przykadowyobiekt wyglda wwczas nastpujco:

    wykroczenie(2007,student(d,szkolenie_bhp)).

    Uwaga: wszystkie opisane tu pojcia nazywamy wsplnie termami.

    Pytanie 2.2. Co to jest predykat? Bardzo czsto nie mamy moliwoci opisaniazbioru wymieniajc jego elementy. Wwczas uyteczny okazuje si sposb definiowaniazbioru przez okrelenie waciwoci wsplnych dla wszystkich elementw tego zbioru. Za-pis

    {x|P (x)}oznacza zbir wszystkich takich elementw x, dla ktrych wyraenie P (x), gdzie x jestzmienn a P stwierdzeniem, jest prawdziwe. Na przykad

    {x|x jest liczb cakowit wiksz ni 3 i niewiksz ni 10}oznacza zbir liczb {4, 5, 6, 7, 8, 9, 10}.

    Tak wic elementem zbioru {x|P (x)} jest kady obiekt t, dla ktrego wyraenie P (t)jest prawdziwe. Wyraenie P (x) nazywane jest predykatem, funkcj zdaniow lubform zdaniow. W jzyku angielskim funkcjonuje okrelenie propositional functionoddajce to, e, kadorazowy wybr konkretnego podstawienia za zmienn x powodujeutworzenie zdania (ktre mona rozumie jako propozycj okrelenia czego jako co,twierdzenie, wniosek), ktre jest albo faszywe albo prawdziwe.

    W rachunku predykatw pierwszego rzdu (ang. first-order logic, predykat moe pe-ni rol waciwoci przypisanej obiektom lub relacji je czcej. Przypatrzmy si takimzdaniom

    Mi jest ty2. Banan jest ty. Samochd Ferrari jest ty3.

    Wszystkie one pasuj do szablonu . . . x . . . jest ty. Wyraenie jest ty to wa-nie predykat opisujcy cech bycia tym. Jeli przyjmiemy oznacza ten predykat jakojest_zolty lub krcej zolty, wwczas kade zdanie zolty(x) czytamy jako x jest ty,co rozumiemy jako obiekt x posiada cech mwic o tym, e jest ty.

    Z kolei zdania2Chodzi o Kubusia Puchatka w wizualizacji The Walt Disney Company3Zdaniem mionikw marki, prawdziwe Ferrari powinno by pomalowane na czerwono. Wzio si to

    ze zwyczaju zaoyciela, ktry malowa swoje samochody wycigowe na tzw. rosso corsa. Do dziczerwony kolor jest najpopularniejszy wrd samochodw Ferrari, mimo e oficjalnym kolorem jestkanarkowy ty giallo modena, taki jak ten w tle znaczka Ferrari, przejty przez zaoyciela z herbumiasta Modena, w ktrym si urodzi.

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 2.3. PYTANIA I ODPOWIEDZI 19

    Ja da piernika Magosi. Cezary da ksik Gosi.

    powstay przez odpowiednie podstawienia w szablonie . . . x . . . da . . . y . . . z . . . . Szablonkto da co komu jest predykatem opisujcym w tym przypadku zwizek (relacj) po-midzy obiektami. Take i w tym przypadku czciej bdzie si uywao jego krtszychwersji, np. dal(x,y,z).

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 20 ROZDZIA 2. SKADNIA PROLOGU

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • Rozdzia 3

    Ewaluacja zapytania

    3.1 Dopasowywanie wyrae

    Dwa termy nazwiemy pasujcymi do siebie (ang. match) jeli s identyczne lub mog stasi identyczne w wyniku podstawienia odpowiednich wartoci za zmienne (ang. variableinstantiation). Istotnym jest, aby podstawienie za zmienne byo identyczne w caymwyraeniu. Jedynym wyjtkiem jest zmienna anonimowa, ktra moe mie inna wartow rnych miejscach. Na przykad dwa termy

    jakisTerm(a,b)jakisTerm(a,X)

    pasuj do siebie, gdy podstawienie za zmienn X atomu b czyni te termy identycznymi

    ?- jakisTerm(a,b)=jakisTerm(a,X).X = b

    Nie bd natomiast pasowa termy w nastpujcych przykadach

    ?- jakisTerm(a,b)=jakisTerm(X,X).No?- jakisTerm(a,X)=jakisTerm(X,b).No

    gdy X nie moe mie jednoczenie nadanej wartoci a i b. Zastpienie X zmienn anoni-mow (_) powoduje, e wyraenia zaczynaj pasowa do siebie

    ?- jakisTerm(a,b)=jakisTerm(a,_).Yes?- jakisTerm(a,_)=jakisTerm(_,b).Yes

    Dopasowywanie do siebie wcale nie jest takim trywialnym procesem, o czym moemy siprzekona patrzc na poniszy przykad

    ?- b(X,a)=b(f(Y),Y), d(f(f(a)))=d(U), c(X)=c(f(Z)).X = f(a),Y = a,U = f(f(a)),Z = a

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 22 ROZDZIA 3. EWALUACJA ZAPYTANIA

    Opisany powyej proces dopasowywania nazywany jest take unifikacj (ang. unifica-tion).

    Algorytm unifikacji

    Niech T1 i T2 bd termami.

    Jeli algorytm zwrci warto FAIL oznacza to, e unifikacja nie jest moliwa. Jeli algorytm zwrci warto NULL oznacza to, e wyraenia pasuj do siebie

    bez koniecznoci dokonywania podstawienia.

    Jeli algorytm zwrci podstawienie typu a|b oznacza to, e nie ma wicej podsta-wie koniecznych do unifikacji T1 i T2.

    Jeli algorytm zwrci list SUBST , to zawiera ona wszystkie podstawienie nie-zbdne do unifikacji T1 i T2.

    1. Jeli T1 i T2 nie s jednoczenie termem zoonym, wwczas

    (a) Jeli T1 i T2 s identyczne, wwczas zwr NULL.(b) Jeli T1 jest zmienn i jeli T1 wystpuje w T2, wwczas zwr FAIL, w

    przeciwnym razie zwr T2|T1.(c) Jeli T2 jest zmienn i jeli T2 wystpuje w T1, wwczas zwr FAIL, w

    przeciwnym razie zwr T1|T2.(d) Zwr FAIL.

    2. Jeli T1 i T2 s jednoczenie termem zoonym, wwczas

    (a) Jeli nazwy termw T1 i T2 s rne, wwczas zwr FAIL.(b) Jeli termy T1 i T2 maj rn ilo argumentw, wwczas zwr FAIL.(c) Wyczy list SUBST . Lista ta bdzie zawieraa wszystkie podstawienia

    niezbdne do unifikacji T1 i T2.(d) Dla i zmieniajcego si od 1 do iloci argumentw termu T1 wykonaj

    i. Wywoaj algorytm unifikacji dla i-tego argumentu z T1 i i-tego argumentuz T2. Wynik zapisz z zmiennej S.

    ii. Jeli S zawiera FAIL, wwczas zwr FAIL.iii. Jeli S jest rne od NULL, wwczas

    A. Zastosuj S do pozostaych czci termw T1 i T2.B. Dodaj do listy SUBST podstawienia z S.

    (e) Zwr SUBST .

    Kroki 1 (b) i 1 (c) s warunkami chronicymi przed prb unifikacji zmiennej z wy-raeniem zawierajacym t zmienn, co mogoby prowadzi do nieskoczonej rekurencji,np.

    X i a(X)

    lub

    a(X,X) i a(b(X),b(X))

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 3.2. OBLICZANIE CELU 23

    3.2 Obliczanie celu

    Zatwierdzenie zapytania powoduje uruchomienie procesu majcego na celu wykazanie,e istnieje cig podstawie i przeksztace pozwalajcy przypisa zapytaniu warto lo-giczna prawda. Poszukiwanie takiego dowodu nazywane jest obliczaniem celu (ang.goal execution). Kady predykat wchodzcy w skad zapytania staje si (pod)celem,ktry Prolog stara si speni jeden po drugim. Jeli identyczne zmienne wstpuj wkilku podcelach, wwczas, jak to byo ju opisane, zwizane jest z nimi identyczne pod-stawienie.

    Jeli cel pasuje do gowy reguy, wwczas maj miejsce odpowiednie podstawieniawewntrz reguy1 i tym samym otrzymujemy nowy cel, zastpujcy niejako cel poczt-kowy. Jeli cel ten skada si z kilku predykatw, wwczas zostaje on podzielony na kilkapodceli, przy czym kady z nich traktujemy jak cel pierwotny. Proces zastpowaniawyraenia przez inne wyraenie nazywamy rezolucj i mona opisa go nastpujcymalgorytmem

    1. Dopki zapytanie nie jest puste, wykonuj:

    (a) Wybierz term z zapytania2.

    (b) Znajd fakt lub regu unifikujc si z termem3. Jeli nie ma adnego faktulub reguy, zwr FAIL, w przeciwnym razie kontynuuj.

    i. Jeli znaleziono fakt, usu go z zapytania.ii. Jeli znaleziono regu, zastp term ciaem reguy.

    2. Zwr SUCCESS.

    Stosowanie unifikacji i rezolucji pozwala na wykazanie prawdziwoci lub jej braku,wedug nastpujcych zasad

    1. Jeli cel jest zbiorem pustym, zwr prawd.

    2. Jeli nie ma gw regu lub faktw unifikujcych si z rozwaanym wyraeniem,zwr fasz.

    3. W przypadku niepowodzenia (otrzymanie wartoci fasz), wr do takiego miejsca,w ktrym stosujc rezolucj moesz uzyska inne wyraenie i ponw cay proces.Zasada ta nazywana jest nawracaniem (ang. backtracking) (wicej przykadwzwizanych z nawracaniem podanych zostanie w rozdziale 5).

    W opisie tym szczeglnie istotny jest krok 3, ktry niejako powoduje restart caego al-gorytmu. Oznacza to, e Prolog w punkcie 1 (b) zapamituje miejsce wystpowaniaunifikatora i w odpowiednim momencie jest w stanie poszukiwa kolejnych unifikatorwwystpujcych za wanie wybranym. Powysze zasady stosujemy tak dugo, a wyczer-piemy wszystkie moliwoci wybierajc na kadym z etapw kolejne dostpne wyraenia.Dziki temu mamy moliwo znalezienia kilku rnych dowodw.

    Pokaemy teraz prosty przykad, ktry pozwoli lepiej pokaza kiedy mamy do czy-nienia z unifikacj a kiedy z rezolucj. Dla programu

    1Wewntrz (w ciele) reguy, czyli po prawej stronie operatora :-2Zwykle termy wybierane s od lewej do prawej.3Zwykle fakty i reguy przeszukiwane s w kolejnoci ich wystpowania w pliku.

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 24 ROZDZIA 3. EWALUACJA ZAPYTANIA

    a(b,c).a(c,d).aa(X,Y) :- a(X,Z),a(Z,Y).

    zapytanie

    aa(b,A).

    pociga za sob nastpujcy proces.

    Krok 1. Rezultatem unifikacji dla aa(b,A) oraz aa(X,Y) jest podstawienie

    X = a A = Y

    Resolucja: zastpujc aa(b,A) przez a(X,Z), a(Z,Y) i stosujc uzyskane podsta-wienie otrzymujemy nowe zapytanie:

    a(b,Z),a(Z,Y).

    Krok 2. Z uzyskanego w poprzednim kroku zapytania wybieramy atom a(b,Z) i wwyniku unifikacji z faktem a(b,c) otrzymujemy podstawienie

    Z=c

    Rezolucja: poniewa unifikacja dotyczya faktu wic rozpatrywany atom z zapy-tania zostaje usunity (zastpiony przez element pusty) po czym do otrzymanegow ten sposb wyraenia stosujemy unifikacj w wyniku czego otrzymujemy kolejnezapytanie

    a(c,Y).

    Krok 3. W uzyskanym w poprzednim kroku zapytaniu wystpuje tylko jeden atoma(c,Y) i w wyniku unifikacji z faktem a(c,d) otrzymujemy podstawienie

    Y=d

    Rezolucja: poniewa unifikacja dotyczya faktu wic rozpatrywany atom z zapy-tania zostaje usunity w wyniku czego otrzymujemy puste zapytanie, co oznaczakoniec procesu.

    Innymi sowy mona powiedzie, e unifikacja jest, podobnie jak w tradycyjnymprogramowaniu, przypisywaniem wartoci do zmiennych, natomiast rezolucja sposobemprzekonstruowywania zapytania.

    Wicej szczegw na ten temat podamy w dalszej czci wykadu (patrz rozdzia??) teraz zaley nam gwnie na wyrobieniu waciwej intuicji.

    Kolejny przykad pokae, e proces unifikacji, rezolucji i nawracania prowadzi czstodo rezultatw sprzecznych z oczekiwaniem. Rozwamy taki program

    mniej(p1,p2).mniej(p2,p3).mniej(p3,p4).

    mniej(X,Y) :- mniej(X,Z),mniej(Z,Y).

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 3.2. OBLICZANIE CELU 25

    Intencja jest jasna: definiujemy kilka obiektw (tj. p1, p2, p3, p4) powizanych relacjmniej. Do tego wprowadzamy regu przechodnioci, ktra w zaoeniu ma pozwoli napowizanie ze sob np. obiektu p1 i p4. Niestety zapytanie

    ?- mniej(A,B).

    nie zwraca tego co, naszym zdaniem, powinno zwrci

    A = p1,B = p2 ;

    A = p2,B = p3 ;

    A = p3,B = p4 ;

    A = p1,B = p3 ;

    A = p1,B = p4 ;

    ERROR: Out of local stack

    Jest para (A=p2, B=p3), ale gdzie para (A=p2, B=p4)? Wytumaczenie tego jest na-stpujce (rwnolegle z opisem prosz ledzi drzewo wywoa, bo cho nie pozbawionewad, moe uatwi kontrolowanie co i kiedy jest wywoywane). Ponumerujmy najpierwlinie programu, aby atwiej nam byo si do nich odnosi

    1 mniej(p1,p2).2 mniej(p2,p3).3 mniej(p3,p4).

    4 mniej(X,Y) :- mniej(X,Z),mniej(Z,Y).

    Zapytanie mniej(A,B). powoduje, ze Prolog, szuka (od poczatku pliku, po kolei) czego,co moe z tym zapytaniem zosta zunifikowane. Tak wic po kolei, pasuje fakt 1 (linia 2w drzewie wywoa patrz dalej), wic jako wynik mamy

    A = p1,B = p2 ;

    Szukajc dalej, pasuje fakt 2 (linia 3 w drzewie wywoa) i mamy

    A = p2,B = p3 ;

    i pasuje te fakt 3 (linia 4 w drzewie wywoa), w zwizku z czym mamy

    A = p3,B = p4 ;

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 26 ROZDZIA 3. EWALUACJA ZAPYTANIA

    Szukamy dalej a dalej mamy regu (4) (linia 5 w drzewie wywoa). A wic sprbujemyuy reguy, do tego aby znale podstawienie za A i B. Aby jednak uy reguy, naleyspeni dwa warunki jakie w niej wystpuj. Pierwszym warunkiem jest poszukiwanieczego, co speni mniej(X,Z) (linia 6 w drzewie wywoa (d.w.)). Poniewa w tymmomencie mniej(X,Z) peni rol podcelu, wic rozpoczynamy przeszukiwanie pliku odpocztku. Dla tego podcelu znajdujemy fakt 1, ktry do niego pasuje (linia 7 w d.w.).To powoduje, e mamy podstawienie (X=p1, Z=p2), dziki czemu moemy przej doprby wykazania drugiej czci reguy, ktra teraz przyjmuje posta z linii 8 drzewawywoa i staje si nowym podcelem. Ponownie rozpoczynamy przeszukiwanie plikuod poczatku w celu znalezienia czego co unifikuje si z tym podcelem. Jako pierwszpasujc znajdujemy regu 2 (linia 9 w d.w.). Dopasowanie to powoduje, e Y przyjmujewarto p3. W tym momencie, wszystkie podcele reguy z linii 5 d.w. s spenione(podstawienia to X=p1, Z=p2, Y=p3) i moe zosta zwrcony nastpujcy wynik

    A = p1,B = p3 ;

    Kontynuujemy poszukiwania tego co moe speni podcel m(p2,Y) (linia 8 w d.w.). Fakt3 nie pasuje, ale mamy regu (4, linia 10 w d.w.). W tym momencie, w wyniku wcze-niejszych podstawie, regula ta jest wywoana jako mniej(p2,Y) w wyniku czego jejpodcele przyjm posta mniej(p2,Z) i mniej(Z,Y). Zauwamy, e speniajc regu zlinii 10 d.w. speniamy tym samym drugi warunek (linia 8 w d.w.) reguy z linii 5 d.w.a wic i nasz gwny cel. Aby j speni naley znale co co speni jej pierwsza cz,ktra przyjmuje posta mniej(p2,Z) (linia 11 w d.w.). Podobnie jak wczeniej (linia 8 wd.w.), widzimy, e pierwszy podcel spenia fakt 2. Zatem wiemy ju, e Z ma wartosc p3(linia 12 w d.w.). Zatem aby speni drug cz reguy, trzeba znale fakt lub reguspeniajc mniej(p3,Y) (linia 13 w d.w.). Spelnia to fakt 3 i w zwizku z tym mamypodstawienie Y=p4. Majc spenione podcele z linii 11 i 13 d.w. moemy powiedzie, espeniony jest podcel z linii 8 d.w. a w konsekwencji regua z linii 5 d.w. Wszystko tozachodzi przy nastpujcych podstawieniach: X=p1 Y=p4 (i cho to mao dla nas istotne,take Z=p2). Potwierdzeniem takiego rozumowania jest kolejny wynik zwrcony przezProlog

    A = p1,B = p4 ;

    Powracamy do podcelu z linii 13 d.w. i kontynuujemy poszukiwania tego co go spenia.Kolejn, nierozpatrywan rzecz (w sensie fakt, regua), jest regua 4 (linia 15 w d.w.).W tym momencie, w wyniku wczeniejszych podstawie, regua ta jest wywoana jakomniej(p3,Y) w wyniku czego jej podcele przyjm posta mniej(p3,Z) i mniej(Z,Y).Zauwamy, e regua z linii 15 spenia podcel z linii 13, co z koleii powoduje spenieniereguy z linii 10 d.w.. Speniamy tym samym drugi warunek (linia 8 w d.w.) reguy zlinii 5 d.w. a wic i nasz gwny cel. Aby jednak speni regu z linii 15 naley znalefakt lub regu speniajce jej pierwsz cz, ktra przyjmuje posta mniej(p3,Z) (linia16 w d.w.). Widzimy, e podcel ten spenia regua 3 (linia 17 w d.w.). Zatem wiemy ju,e Z ma wartosc p4. Zatem aby speni drug cz reguy, trzeba znale fakt lub reguspeniajc mniej(p4,Y) (linia 18 w d.w.). aden fakt tego nie spenia, ale moe speniregua (4) (linia 19 w d.w.). Aby jednak regua moga by speniona, naley spenijej dwa podcele. Pierwszy podcel, w wyniku podstawie przyjmuje posta mniej(p4,Z)(linia 20 w d.w.). Podobnie jak to byo przed chwil, aden fakt tego nie spenia, ale

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 3.2. OBLICZANIE CELU 27

    moe speni regua (4) (linia 21 w d.w.). Aby jednak regua moga by speniona,naley speni jej dwa podcele. Pierwszy podcel, w wyniku podstawie przyjmuje postamniej(p4,Z) (linia 22 w d.w.). Podobnie jak to byo przed chwil jedynym faktem lubregu, ktre mog ewentualnie speni ten podcel, jest znowu regua (4) (linia 23 wd.w.). Jak widzimy regua bdzie wywoywa regu, ktra znowu wywoa regu itd.To dlatego jako ostatni widoczny efekt dziaania otrzymujemy

    ERROR: Out of local stack

    czyli przepenienie stosu w wyniku zbyt duej iloci wywoa rekurencyjnych.

    Drzewo wywoa dla programu

    mniej(p1,p2).mniej(p2,p3).mniej(p3,p4).mniej(X,Y) :- mniej(X,Z),mniej(Z,Y).

    i zapytania

    mniej(A,B).

    1 m(A ,B).|

    2 +-m(p1,p2).|

    3 +-m(p2,p3).|

    4 +-m(p3,p4).|

    5 +-m(X,Y) :- m(X,Z),m(Z,Y).|

    6 +---m(X ,Z)| |

    7 | +-m(p1,p2).|

    8 +-------------,m(p2,Y)|

    9 +-m(p2,p3).|

    10 +-m(X,Y) :- m(X,Z),m(Z,Y).|

    11 +---m(p2,Z)| |

    12 | +-m(p2,p3).|

    13 +-------------,m(p3,Y)|

    14 +-m(p3,p4).|

    15 +-m(X,Y) :- m(X,Z),m(Z,Y).|

    16 +---m(p3,Z)

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 28 ROZDZIA 3. EWALUACJA ZAPYTANIA

    | |17 | +-m(p3,p4).

    |18 +-------------,m(p4,Y)

    |19 +-m(X,Y) :- m(X,Z),m(Z,Y).

    |20 +---m(p4,Z)

    |21 +-m(X,Y) :- m(X,Z),m(Z,Y).

    |22 +---m(p4,Z)

    |23 +-m(X,Y) :- ...

    |... ...

    Jak wic widzimy powodem niepowodzenia jest dopuszczenie do sytuacji, w ktrejregua bdzie wywoywa sam siebie. Co gorsza podcel reguy bdzie si tylko unifikowaz gow reguy (np. linie 18 i 19, 20 i 21, 22 i 23 itd.). W takich (dosy typowych)sytuacjach problematycznych, rozwizaniem jest uycie innych nazw dla faktw, gowyreguy i przynajmniej czsciowe przekonstruowanie reguy/faktw, np. w nastpujcysposb

    mniej(p1,p2).mniej(p2,p3).mniej(p3,p4).

    jestMniejszy(X,Y) :- mniej(X,Y).jestMniejszy(X,Y) :- mniej(X,Z),jestMniejszy(Z,Y).

    Ten program daje ju poprawne i zgodne z oczekiwaniami wyniki

    ?- jestMniejszy(X,Y).

    X = p1,Y = p2 ;

    X = p2,Y = p3 ;

    X = p3,Y = p4 ;

    X = p1,Y = p3 ;

    X = p1,Y = p4 ;

    X = p2,

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 3.3. PYTANIA I ODPOWIEDZI 29

    Y = p4 ;

    No

    3.3 Pytania i odpowiedzi

    Pytanie 3.1. Co to jest unifikacja? Unifikacja (ang. unification) oznacza ujednoli-canie, ktre w konkretnych dyscyplinach naukowych moe by rnie rozumiane4.

    Logika W logice jest to proces ujednolicania, w wyniku ktrego zakresy pojciowe lubznaczenia niezwizane ze sob lub w jaki sposb niezgodne, nabywaj zgodnoci istaj si czci wikszej caoci.

    Informatyka W informatyce unifikacj okreli moemy jako operacj na dwch lubwikszej iloci drzew, ktra znajduje takie przyporzdkowanie zmiennych, e drzewate s rwne. Stosujc do zapisu drzewa notacj polsk5, drzewa

    (+ x 2)(+ (+ y 3) z)

    s unifikowalne dla

    z=2x=(+ y 3)

    Nie s unifikowalne

    (+ x 2) i (+ y 3)(+ x 2) i (- x x)(+ 2 3) i (+ 3 2).

    Otrzymany zbir przyporzdkowa nazywamy unifikatorem.

    Matematyka Niech E bdzie wyraeniem skadajcym si ze zmiennych x1, . . . , xn i sta-ych, natomiast t1, . . . , tn bd wyraeniami. Zbir przyporzdkowa = {t1|x1, ..., tn|xn}6nazywamy podstawieniem. Wyraenie E nazywane jest instancj wyraenia Ejeli otrzymane jest z E przez zastpienie wszystkich wystpie zmiennych xi przezodpowiadajce im wyraenia ti, i = 1, . . . , n. Podstawienie nazywamy unifika-torem dla zbioru wyrae {E1, . . . , Em} jeli E1 = = Em . Dla wyrae

    E1 = x2,

    E2 = y3

    unifikatorem jest = {z3|x, z2|y}.

    4Rnie nie w sensie odmiennie, ale w sensie specyficznie.5Czyli najpierw warto wza a potem jego dzieci.6Zapis ti|xi naley czyta: wyraenie ti podstawione za zmienn xi.

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 30 ROZDZIA 3. EWALUACJA ZAPYTANIA

    Prolog W Prologu unifikacja oznacza proces, w ktrym dla dwch atomw (jednego zzapytania, drugiego bdcego faktem lub gow reguy7) poszukiwane jest takie pod-stawienie, dziki ktremu stan si one identyczne.

    Pytanie 3.2. Co to jest rezolucja? Rezolucja to metoda automatycznego dowodzeniatwierdze oparta na generowaniu nowych klauzul (wyrae) a dojdzie si do sprzecznoci.W ten sposb mona udowodni, e dane twierdzenie nie jest spenialne, lub te, cojest rwnowane, e jego zaprzeczenie jest tautologi. Metoda ta pozwala w oparciu odwa wyraenia zawierajce dopeniajce si postaci literau, wygenerowa nowe wyraeniezawierajce wszystkie literay z wyjtkiem dopeniajcych si, zgodnie z ponisz reguwnioskowania

    a|b, ~a|c---------

    b|c

    Wedug tej reguy, jeli przyjmiemy, e a lub b jest prawd i jednoczenie, e a jest faszemlub c jest prawd, wwczas b lub c jest prawd. Istotnie, jeli a jest prawd, wwczas abydrugie wyraenie byo prawdziwe (a takie jest zaoenie), c musi by prawd. Jeli a jestfaszem, wwczas aby pierwsze wyraenie byo prawdziwe (a takie jest zaoenie), b musiby prawd. Tak wic niezalenie od wartoci logicznej a, jeli przyjmiemy prawdziwozaoe, wwczas b lub c musi by prawd.

    Rozwamy nastpujcy przykad. Z zaoenia prawdziwoci regu

    Jeli zachodzi b to zachodzi a.

    orazJeli zachodzi c to zachodzi b.

    wynika, e zachodzi a jeli tylko zachodzi c. Dokadnie taki sam wynik uzyskamystosujc rezolucje. Zapiszmy podane reguy

    a :- bb :- c

    ktre zgodnie z prawemx => y x|y,

    gdzie symboloznacza negacj, przeksztacamy do postaci

    ~b | a~c | b

    gdzie symbol ~ oznacza negacj. Stosujc rezolucj otrzymujemy

    ~c | a

    co w postaci reguy mona zapisa jako

    a :- c7Gow, czyli czci wystpujc po lewej stronie operatora :-.

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 3.3. PYTANIA I ODPOWIEDZI 31

    Pytanie 3.3. Co to jest nawracanie? Wielokrotnie w Prologu zdarza si, e celmoe zosta speniony na wiele alternatywnych sposobw. Za kadym razem, gdy za-chodzi konieczno wybrania jednej z wielu moliwoci, Prolog wybiera pierwsz z nich(w kolejnoci wystpowania w pliku) zapamitujc przy okazji miejsce w ktrym wybrten zosta dokonany. Jeli w jakim momencie nie powiedzie si prba obliczenia celu,system ma moliwo powrcenia do miejsca otatnio dokonanego wyboru i zastpienia gowyborem alternatywnym. Zachowanie takie nazywamy nawracaniem (wicej przykadwzwizanych z nawracaniem podanych jest w rozdziale 5).

    Prawd mwic, dokadnie ten sam mechanizm dziaa take, gdy powiedzie si obli-czanie celu. O ile jedak w poprzednim przypadku pozwala on na znalezienie cho jednegorozwizania, to w tym przypadku pozwala znale rozwizania alternatywne.

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 32 ROZDZIA 3. EWALUACJA ZAPYTANIA

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • Rozdzia 4

    Listy

    4.1 Skadnia

    Lista jest uporzdkowanym cigiem elementw o dowolnej dugoci. Jako element listymoe by uyty kady prawidowy term Prologu, tzn. atom, liczba, zmienna, termzoony w tym take inna lista. Umieszczamy je pomidzy nawiasami kwadratowymi ([i ]) i rozdzielamy przecinkiem (,), np.

    [a, X, [], b(c, Y), [a, d, e], 123]

    Lista pusta zapisywana jest jako para pustych nawiasw

    []

    Wewntrzna reprezentacja listy opiera si o dwuargumentowy funktor kropka (.). Z re-prezentacji tej mona korzysta tak samo jak z notacji z nawiasami kwadratowymi. Chojest ona mniej wygodna, to czasem uatwia zrozumienie, dlaczego nasz program zacho-wuje si tak a nie inaczej, gdy przetwarza list.Korzystajac z tego funktora, list zawierajc jeden element a moemy zapisa jako

    .(a,[])

    co na rysunku mona przedstawi w nastpujcy sposb

    . .-[]/ \ |

    a [] a

    List zawierajc 3 elementy: a,b,c moemy zapisa jako

    .(a,.(b,.(c,[])))

    co na rysunku mona przedstawi jako

    . .-.-.-[]/ \ | | |

    a . a b c/ \

    b ./ \

    c []

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 34 ROZDZIA 4. LISTY

    W notacji z nawiasami kwadratowymi powysze przykady zapisujemy, odpowiednio,jako

    [a][a,b,c]

    4.2 Gowa i ogon

    Listy zawsze przetwarza si dzielc je na dwie (logiczne) czci: gow (ang. head), ktrstanowi pierwszy element listy (i zarazem pierwszy argument funktora .) i ogon (ang.tail) (stanowicego drugi argument funktora .), ktry jest wszystkim co pozostao z listypo odjciu od niej gowy. Lista pusta nie ma gowy ani tym bardziej ogona. Gowlisty zawierajcej tylko jeden element jest ten wanie element, natomiast ogon jest listpust.

    Do rozdzielenia (rozoenia) listy1 na gow i ogon suy symbol |. Elementy po lewejstronie symbolu odnosz si do gowy lub do kilku pierwszych elementw listy, natomiastpo prawej oznaczaj gow

    ?- []=[H|T].No

    ?- [1,2]=[H|T].H = 1,T = [2]

    ?- [1]=[H|T].H = 1,T = []

    ?- [1,[2,3]]=[H|T].H = 1,T = [[2, 3]]

    ?- [[1,2],3]=[H|T].H = [1, 2],T = [3]

    ?- [1,2,3,4]=[Ha,Hb|T].Ha = 1,Hb = 2,T = [3, 4]

    ?- [[1,2,3],4]=[[H1|T1]|T2].H1 = 1,T1 = [2, 3],T2 = [4]

    Przygldajc si powyszym przykadom zauwaamy, e1Uywany take do konstruowania listy.

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 4.2. GOWA I OGON 35

    Ogon listy, jeli tylko istnieje, jest zawsze list (pust lub nie, ale list). Gowa (a w oglnoci: wszystkie elementy wystpujce przed |) jest elementem

    listy i jako element listy moe by dowolnym termem (a zatem moe, ale nie musiby list).

    Zaskakujce, e to ju wszystko co o listach, rozpatrywanych czysto teoretycznie,mona powiedzie. Zaskakujce dlatego, e lista jest gwn (w sensie siy czy moli-woci) struktur danych Prologu. Prostota ta sprawia, e czasem a trudno uwierzy, eco bedzie dziaa, a gdy ju dziaa to trudno zrozumie jak to si dzieje. Dlatego, celemlepszego zapoznania ze sposobami postpowania z listami, sprbujemy zdefiniowa kilkapredykatw, pozwalajcych wykona pewne elementarne operacje na listach.

    Predykat sprawdzajcy czy co jest list.

    Waciwie kady sposb w jaki staramy si rozwiza problem w Prologu to rekurencja.Zaczynamy od najprostszego przypadku, po czym uoglniamy go na dowolnie zoony.Nie inaczej jest w przypadku predykatu sprawdzajcego, czy co jest list. Najprostszyprzykad listy, to lista pusta. Wszystkie inne listy daj si natomiast rozoy na gowi ogon, przy czym ogon musi by list. Std ostatecznie otrzymujemy

    czyLista([]).czyLista([H|T]) :- czyLista(T).

    Predykat sprawdzajcy czy co naley do listy

    W tym przypadku najprostszy warunek jest nastpujcy: element X naley do listy, jeliX jest gow listy

    isMember(X,[X|_]).

    lub to samo w inny sposb

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

    Jeli natomiast nie jest gow, to musi nelee do ogona listy

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

    Jak to jednak czsto w Prologu bywa, zwykle kady predykat mona uy w celu zupenieinnym ni ten, do ktrego zosta przewidziany. W tym przypadku predykat isMemeber/2moe zosta uyty po to aby wygererowa wszystkie elementy nalece do listy

    ?- isMember(X,[a,b,c]).X = a ;X = b ;X = c ;No

    ?- isMember(X,[a,[b,c],d]).X = a ;X = [b, c] ;X = d ;No

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 36 ROZDZIA 4. LISTY

    Predykat czcy dwie listy

    Przypadek elementarny: lista pusta poczona z list List daje w wyniku niezmienionlist

    polacz([],List,List).

    Przypadek oglny, ktry mona wyrazi opisowo: aby poczy co ([H|T]) z list (List),trzeba najpierw doczy ogon tego czego (T) do listy (List) a nastpnie do wyniku tegopoczenia (Res) dopisa gow (H)

    polacz([H|T],List,[H|Res]) :- polacz(T,List,Res).

    Dziaanie zgodne jest z oczekiwaniem

    ?- polacz([1,2,3],[a,b,c],Res).Res = [1, 2, 3, a, b, c]

    a cig wywoa wyglda jak poniej

    ?- polacz([1,2,3],[a,b,c],Res).

    gowa 1, cze [2, 3] z [a, b, c]gowa 2 cze [3] z [a, b, c]

    gowa 3 cze [] z [a, b, c] wynik to [a, b, c]wynik to [3, a, b, c]

    wynik to [2, 3, a, b, c]

    Res = [1, 2, 3, a, b, c]

    Podobnie jak poprzednio, take i tym razem moemy predykat polacz/3 uy, niezgod-nie z jego pierwotnym przeznaczeniem, do znalezienia odpowiedzi na pytanie, jak listnaley poczy z list [1,2,3] aby otrzyma list [1,2,3,a,b,c]

    ?- polacz([1,2,3],X,[1,2,3,a,b,c]).X = [a, b, c]

    Co wicej, moemy poszukiwa wszystkich par list, ktre poczone daj nam [1,2,3,a,b,c]

    ?- polacz(X,Y,[1,2,3,a,b,c]).X = [],Y = [1, 2, 3, a, b, c] ;

    X = [1],Y = [2, 3, a, b, c] ;

    X = [1, 2],Y = [3, a, b, c] ;

    X = [1, 2, 3],Y = [a, b, c] ;

    X = [1, 2, 3, a],

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 4.3. PYTANIA I ODPOWIEDZI 37

    Y = [b, c] ;

    X = [1, 2, 3, a, b],Y = [c] ;

    X = [1, 2, 3, a, b, c],Y = [] ;

    4.3 Pytania i odpowiedzi

    Pytanie 4.1. Czym jest lista w prologu? Majc niepusty zbir obiektw K moemyutworzy zbir jego wszystkich podzbiorw oznaczany formalnie 2K . List elementw zK moemy zatem utosami z pewnym elmentem nalecym do 2K . Generalnie listama suy reprezentacji jakich danych, a te s z kolei reprezentowane w Prologu przeztermy. Listy s zatem take reprezentowane przez pewne termy i co wane, moe si toodbywa na rne sposoby. W kadej licie moemy wyodrbni gow czyli jej pierwszyelement, (ktry sam moe by jak list!) oraz ogon, czyli pozosta jej cz.

    Pytanie 4.2. Wymie moliwe sposoby zapisu listy.

    .(X,Y) lista o nieokrelonej liczbie elementw. Jej gow jest X, ogonem Y. [X|Y] j.w. [X,Y] dokadnie dwuelementowa lista o gowie X i ogonie Y, przy czym zarwno Xjak i Y mog by listami.

    Oto kilka przykadw mogcych uatwi zrozumienie rznic midzy powyszymi repre-zentacjami. Bazuj one na zmuszeniu Prologu do rozwizania za nas problemu: ktre ztych schematw i kiedy s sobie rwnowane?

    ?- .(X,X)=X.X = [**, **, **, **, **, **, **, **, **|...] ;No

    ?- [X,X]=X.X = [**, **] ;No

    ?- [X|X]=X.X = [**, **, **, **, **, **, **, **, **|...] ;No

    ?- [1,X] = X.X = [1, **] ;No

    ?- [1|X] = X.X = [1, 1, 1, 1, 1, 1, 1, 1, 1|...] ;No

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 38 ROZDZIA 4. LISTY

    ?- .(1,X) = X.X = [1, 1, 1, 1, 1, 1, 1, 1, 1|...] ;No

    ?- [X,Y] = [X|Y].Y = [**] ;No

    ?- [X,Y] = [X|[Y]].Yes

    ?- .(X,Y) = [X,Y].Y = [**] ;No

    ?- .(X,.(Y,[])) = [X,Y].Yes

    ?- .(X,Y) = [X|Y].Yes

    Pytanie 4.3. Podaj przykad wykorzystania listy. Wemy program, ktry liczyilo elementw listy:

    card([],0).card([H|T], X) :- card(T, Y), X is Y + 1.

    Mona go wykorzysta do dalszego sprawdzania jak dziaaj reprezentacje list:

    ?- card([a|[b]],Y).Y = 2 ;No

    ?- card([a|[b,c,d]],Y).Y = 4 ;No

    ?- card([a,[b,c,d]],Y).Y = 2 ;No

    ?- card([a,b,c,d],Y).Y = 4 ;No

    Mona si w ten sposb bardzo dugo bawi... warto jednak uwanie spojrze na poniszewyniki:

    ?- card([a,Y],H).

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 4.3. PYTANIA I ODPOWIEDZI 39

    H = 2 ;No

    ?- card([a|Y],H).

    Y = [],H = 1 ;

    Y = [_G266],H = 2 ;

    Y = [_G266, _G269],H = 3 ;

    Y = [_G266, _G269, _G272],H = 4 ;

    Y = [_G266, _G269, _G272, _G275],H = 5

    [Ctrl+C]Action (h for help) ? [b] break

    ?- card(.(a,Y),H).

    Y = [],H = 1 ;

    Y = [_G813],H = 2 ;

    Y = [_G813, _G816],H = 3 ;

    Y = [_G813, _G816, _G819],H = 4

    [Ctrl+C]Action (h for help) ? [b] break

    Powyszy eksperyment potwierdza tezy dotyczce iloci elementw na poszczeglnych li-stach.

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 40 ROZDZIA 4. LISTY

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • Rozdzia 5

    Odcicie

    5.1 Wiele rozwiza

    Mechanizm odcicia pozwala zaniecha nawracania przez Prolog do wczeniej dokona-nych wyborw. Zajmijmy si na pocztek wieloma rozwizaniami. Zamy, i mamy wbazie nastpujce fakty

    a(b,c).a(b,d).a(e,f).a(d,g).

    Wydajc zapytanie

    ?- a(X,Y).

    otrzymamy nastpujacy cig odpowiedzi

    ?- a(X,Y).X = b Y = c ;X = b Y = d ;X = e Y = f ;X = d Y = g ;No

    Dziki nawracaniu znajdowane s wszystkie rozwizania z bazy danych. Prolog wadnym przypadku nie analizuje czy te nie zapamituje zwracanych wynikw. Std tewynikiem zapytania

    ?- a(X,_).

    jest

    ?- a(X,_).X = b ;X = b ;X = e ;X = d ;No

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 42 ROZDZIA 5. ODCICIE

    Jak wida odpowied X = b pojawia si dwukrotnie, ale z punktu widzenia jzyka s todwa rne rozwizania.

    Pamitajmy, e w Prologu istotna jest kolejno wystpowania faktw i regu. Dlaprogramu

    a(c).a(X) :- b(X).b(d).b(e).a(f).a(g).b(h).a(i).

    efektem zapytania a(X) jest

    ?- a(X).X = c ;X = d ;X = e ;X = h ;X = f ;X = g ;X = i ;No

    Kolejno otrzymanych wynikw na pierwszy rzut oka moe by zaskoczeniem, ale pouwaniejszym przyjrzeniu si im, wszystko powinno sta si jasne.

    Krok 1 Prolog przeszukuje swoj baz wiedzy w poszukiwaniu faktu/reguy, ktre po-zwol jemu ukonkretni zmienn X w zapytaniu a(X). Jako pierwszy z zapytaniemunifikuje si fakt a(c) i std pierwsza odpowied X = c.

    Krok 2 Nastpnie z zapytaniem unifikuje si regua a(X) :- b(X)., w zwizku z czymProlog bdzie stara si obliczy wszystkie cele z niej wynikajce, czyli w tymprzypadku b(X).

    Krok 2.1 Z podcelem b(X) jako pierwszy unifikuje si fakt b(d). To powodujespenienie caej reguy a(X) :- b(X). a tym samym i zapytania a(X) i stddruga odpowied X = d.

    Krok 2.2 Nastpnie z podcelem b(X) unifikuje si fakt b(e). To powoduje spe-nienie caej reguy a(X) :- b(X). a tym samym i zapytania a(X) i stdtrzecia odpowied X = e.

    Krok 2.3 Nastpnie z podcelem b(X) unifikuje si fakt b(h). To powoduje spe-nienie caej reguy a(X) :- b(X). a tym samym i zapytania a(X) i stdczwarta odpowied X = h.

    Krok 2.4 Poniewa nie ma ju niczego co pozwoli obliczy podcel b(X), wic tymsamym Prolog powraca do ostatniego punktu decyzyjnego, czyli poszukujefaktu/reguy wystpujcych po regule a(X) :- b(X). i speniajcych zapy-tanie a(X)..

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 5.1. WIELE ROZWIZA 43

    Krok 3 Jako kolejny, z zapytaniem a(X) unifikuje si fakt a(f). i std pita odpowiedX = f.

    Krok 4 Jako kolejny, z zapytaniem a(X) unifikuje si fakt a(f). i std szsta odpowiedX = g.

    Krok 5 Jako kolejny, z zapytaniem a(X) unifikuje si fakt a(f). i std sidma odpo-wied X = i.

    Krok 6 Brak unifikatorw dla a(X). Zakoczenie oblicze dla zapytania.

    Rozwamy teraz przykad z dwoma celami majcymi po kilka rozwiza.

    a(X,Y) :- b(X), c(Y).

    b(d).b(e).b(f).

    c(g).c(h).c(i).

    A oto uzyskany wynik

    ?- a(X,Y).X = d Y = g ;X = d Y = h ;X = d Y = i ;X = e Y = g ;X = e Y = h ;X = e Y = i ;X = f Y = g ;X = f Y = h ;X = f Y = i ;No

    Ponownie przeanalizujmy dlaczego otrzymalimy taki wanie wynik.

    Krok 1 Prolog przeszukuje swoj baz wiedzy w poszukiwaniu faktu/reguy, ktre po-zwol jemu ukonkretni zmiene X i Y w zapytaniu a(X,Y). Jako pierwsza z za-pytaniem unifikuje si regua a(X,Y) :- b(X), c(Y)., w zwizku z czym Prologbdzie stara si obliczy wszystkie cele z niej wynikajce, czyli w tym przypadkunajpierw b(X).

    Krok 2.1 Z podcelem b(X) jako pierwszy unifikuje si fakt b(d). To powodujespenienie pierwszego podcelu i ukonkretyzowanie zmiennej X przez d.Krok 2.1.1 Prolog prbuje obliczy drugi z podceli reguy a(X,Y) :- b(X), c(Y).,

    czyli c(Y). Jako pierwszy z takim podcelem unifikuje si fakt c(g). To po-woduje spenienie drugiego podcelu i ukonkretyzowanie zmiennej Y przezg. Poniewa spenione zostay wszystkie podcele reguy, wic prologzwraca pierwsz odpowied X = d Y = g.

    Programowanie w logice. Prolog c20072009 by P. Fulmaski (ostatnia modyfikacja: 18 maja 2009)

  • 44 ROZDZIA 5. ODCICIE

    Krok 2.1.2 Nastpnie z podcelem c(Y) unifikuje si fakt c(h). To powo-duje spenienie drugiego podcelu i ukonkretyzowanie zmiennej Y przez h.Poniewa spenione zostay wszystkie podcele reguy, wic prolog zwracadrug odpowied X = d Y = h.

    Krok 2.1.3 Nastpnie z podcelem c(Y) unifikuje si fakt c(i). To powo-duje spenienie drugiego podcelu i ukonkretyzowanie zmiennej Y przez i.Poniewa spenione zostay wszystkie podcele reguy, wic prolog zwracatrzeci odpowied X = d Y = i.

    Krok 2.1.4 Poniewa nie ma ju niczego co pozwoli obliczy podcel c(Y),wic tym samym Prolog powraca do ostatniego punktu decyzyjnego, czyliposzukuje faktu/reguy wystpujcych po fakcie b(d) i pozwalajcychobliczy podcel b(X).

    Krok 2.2 Jako kolejny z podcelem b(X) unifikuje si fakt b(e). To powodujespenienie pierwszego podcelu i ukonkretyzowanie zmiennej X przez e.

    Krok 2.2.1 Prolog prbuje obliczy drugi z podceli reguy a(X,Y) :- b(X), c(Y).,czyli c(Y). Jako pierwszy z takim podcelem unifikuje si fakt c(g). To po-woduje spenienie drugiego podcelu i ukonkretyzowanie zmiennej Y przezg. Poniewa spenione zostay wszystkie podcele reguy, wic prologzwraca czwart odpowied X = e Y = g.

    Krok 2.2.2 Nastpnie z podcelem c(Y) unifikuje si fakt c(h). To powo-duje spenienie drugiego podcelu i ukonkretyzowanie zmiennej Y przez h.Poniewa spenione zostay wszystkie podcele reguy, wic prolog zwr