Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
pl:prolog:prolog_lab:prolog_lab_2 [2008/10/17 17:00]
gjn wskazówki
— (aktualna)
Linia 1: Linia 1:
-====== 2 LAB: Pisanie programów w Prologu ====== 
  
-===== WPROWADZENIE ===== 
- 
-==== Temat: Wypisywanie odpowiedzi ==== 
- 
-Predykat //write/1// wypisuje term na wyjście; //nl/0// przechodzi do nowej linii. 
- 
-==== Temat: Wymuszanie nawrotów ==== 
- 
- 
-Predykat //fail/0// pozwala na wymuszanie nawrotów w procesie poszukiwania rozwiązania,​ co pozwala w szczególności na znalezienie wszystkich rozwiązań problemu. 
- 
-Przypomnienie:​ Prolog używa strategii przeszukiwania wgłąb drzewa rozwiązań problemu i zatrzymuje sie po napotkaniu 1. poprawnego rozwiązania. 
- 
-==== Temat: Programy interaktywne ==== 
- 
- 
-Predykat read/1 pozwala na pobieranie danych od użytkownika. 
- 
-==== Temat: Modyfikacje bazy wiedzy ==== 
- 
- 
-Predykaty //​assert/​a/​z /1//, //​retract/​a/​z /1// pozwalają na dodawanie, usuwanie faktów do/z bazy wiedzy, na/do jej początku/​końca. 
- 
-Predykat //​abolish/​1//​ pozwala usunąć predykat z bazy wiedzy. 
- 
-Predykat //​retractall/​1//​ pozwala usunąć klauzule danego predykatu z bazy wiedzy. 
- 
-Predykaty //see/n//, //​tell/​told//​ pozwalają na odczyt, zapis bazy wiedzy z/do pliku. 
- 
-==== Temat: Dynamiczna baza wiedzy: reguły ==== 
- 
-assert/​retract pozwala również dodawac/​usuwac reguły: 
- 
-<code prolog> 
-:​-dynamic(a/​1),​ dynamic(b/​2). 
- 
-a(1). a(2). 
- 
-addrule:- assert((b(X,​Y):​-a(X),​a(Y))). 
- 
-delrule:- retract((b(_,​_):​-_)). 
- 
-start:​-addrule,​ b(X,Y), write(X), write(' ​ '), write(Y),​nl,​fail. 
-start. 
-</​code>​ 
- 
-W powyższym programie predykat ''​addrule/​0''​ dodaje (''​delrule/​0''​ usuwa) dynamicznie regułę: 
-<code prolog> 
-b(X,​Y):​-a(X),​a(Y). 
-</​code>​ 
- 
-==== Temat: Zadanie celu, uruchamianie programów ==== 
- 
-Konstrukcja:​ 
- 
-  :- cos. 
- 
-pozwala na podanie celu w programie, np.: 
- 
-  :- dynamic(capital_of/​2). 
-  :- go. 
-  :- start. 
- 
-Prolog przystąpi do zrealizowania celu po załadowaniu kodu. 
- 
-Uruchomienie programu ze wskazanego pliku (''​plik.pl''​) z poziomu systemu operacyjnego można zrealizować za pomocą: 
- 
-  swipl -t halt -s plik.pl 
- 
- 
-==== Temat: Śledzenie pracy programu ==== 
- 
-Interpretery Prologu pozwalają na śledzenie pracy programu. W tym celu należy włączyć śledzenie analizowania konkretnego predykatu przez //spy/1//, a następnie włączyć tryb śledzenia pracy programu przez //​trace/​0//​. 
- 
-Debugger wyłącza się przez //​nodebug/​0//​. 
- 
-==== Temat: Obliczenia arytmetyczne i operatory porównania ==== 
- 
- 
-W Prologu nie można w sposób //​bezpośredni//​ wykonywać obliczeń arytmetycznych. Służy do tego predykat //is//. 
- 
- 
-==== Temat: Prosty system ekspertowy ==== 
- 
- 
-W Prologu niezwykle prosto tworzy się systemy ekspertowe. 
- 
-Przykład takiego systemu znajduje sie w pliku {{car.pl}} 
- 
-Dodatkowo korzysta on z pliku {{getyesno.pl}} 
- 
-Jest to system bazujący na wbudowanym w Prolog mechanizmie wnioskowania,​ tj. wnioskowaniu wstecz, czyli abdukcji. 
- 
- 
- 
- 
-===== ĆWICZENIA ===== 
- 
- 
-==== 2.1 Ćwiczenie: Wyświetlanie wyników pracy programu ==== 
- 
- 
-Przetestować działanie: 
- 
-  write('​Ala ma '​),​write('​kota'​),​nl,​write('​w ciapki!'​). 
- 
- 
-==== 2.2 Ćwiczenie: Użycie fail ==== 
- 
- 
-Pobrać i wczytać program {{fam2.pl}} 
- 
-Wyświetlić go przez listing. 
- 
-Sprawdzić działanie: 
- 
-  ?- kobieta(K),​write(K),​write('​ to kobieta.'​),​nl. 
- 
-Jak wymusić odnajdywanie kolejnych kobiet. 
- 
-Sprawdzić działanie: 
- 
-  ?- kobieta(K),​write(K),​write('​ to kobieta.'​),​nl,​fail. 
- 
-Sprawdzić działanie: 
- 
-  ?- kobieta(K),​fail. 
- 
-Dlaczego nic się nie pojawia? 
- 
-Pobrać i wczytać program {{capitals.pl}} 
- 
-Sprawdzić działanie: 
- 
-  ?- capital_of(A,​B),​ write(B), write('​ to stolica '), write(A), nl. 
-  ?- capital_of(A,​B),​ write(B), write('​ to stolica '), write(A), nl, fail. 
- 
-==== 2.3 Ćwiczenie: Praca interaktywna ==== 
- 
- 
-Proszę oglądnąć zastosowanie //read/1// na przykładzie programu {{interac.pl}} 
- 
-Po załadowaniu proszę wpisać: 
- 
-  ?- go. 
- 
- 
- 
- 
- 
- 
- 
- 
-==== 2.4 Ćwiczenie: Dynamiczna modyfikacja bazy wiedzy ==== 
- 
-Proszę napisać: 
- 
-  ?- assert(kobieta(kopernik)). 
- 
-jak zmieniła sie wiedza na temat kobiet? 
- 
-  ?- listing(kobieta). 
- 
-Proszę sprawdzić: 
- 
-  kobieta(K),​write(K),​write('​ to kobieta.'​),​nl,​fail. 
- 
-Uwaga: niektóre kompilatory Prologu (np. SWI) wymagają wcześniejszego zadeklarowania predykatu jako takiego, który może być dynamicznie modyfikowany. Robi się to przez predykat //​dynamic/​1//,​ np. dla predykatu //​kobieta/​1//​ deklaracja w pliku //fam2.pl// ma postać '':​- dynamic(kobieta/​1).''​. 
- 
-Proszę oglądnąć zastosowanie //​assert/​retract//​ na przykładzie programu {{learner.pl}} 
- 
-Początkowa baza wiedzy jest w pliku {{learner_kb.pl}} 
- 
-Należy uruchomić program przez ''​start.''​ 
- 
-Jakie 3 przypadki odpowiedzi są brane pod uwagę? Co dzieje się przy wyjściu z programu i jak to wpływa na jego kolejne uruchamianie?​ 
- 
-Uwaga: operator ''​\+''​ oznacza //​negację//​. 
- 
-Predykat //​dynamic/​1//​ jest potrzebny w niektórych implementacjach Prologu (np. SWI) do umożliwienia wykonywania dynamicznych modyfikacji,​ t.j. //assert// i //​retract//​. 
- 
-==== 2.5 Ćwiczenie: Śledzenie pracy programu ==== 
- 
- 
-Sprawdzić działanie: 
- 
-<code prolog> 
-?- [capitals]. 
-?- spy(capital_of). 
-[debug] ​ ?- trace. 
-[trace] ​ ?- capital_of(A,​B),​ write(B), write('​ to stolica '), write(A), nl. 
-[trace] ​ ?- capital_of(A,​B),​ write(B), write('​ to stolica '), write(A), nl, fail. 
-</​code>​ 
- 
-W SWI Prologu można też skorzystać z dodatkowego pakietu XPCE, w którym jest też wizualny debugger. 
- 
-Należy wyjść z bieżacej sesji SWI. Uruchomić interpreter z powłoki unixa przez przez polecenie ''​xpce''​. Następnie wykonać: 
- 
-<code prolog> 
-?- [capitals]. 
-?- spy(capital_of). 
-[debug] ​ ?- guitracer. 
-[debug] ​ ?- trace. 
-[trace] ​ ?- capital_of(A,​B),​ write(B), write('​ to stolica '), write(A), nl, fail. 
-</​code>​ 
- 
- 
- 
- 
-==== 2.6 Ćwiczenie: Obliczenia i operatory porównania ==== 
- 
- 
-1. Sprawdzić działanie: 
- 
-<code prolog> 
-?- X is 2 + 2. 
-?- Y is 2.5 + ( 4 / 2). 
-?- Z is 2 + 0.001. 
-</​code>​ 
- 
-Uwaga: 
- 
-<code prolog> 
-?- A is 3. 
-?- B is A + 4. 
-?- A is 3, B is A + 4. 
-</​code>​ 
- 
-Operacje arytmetyczne:​ 
- 
-<code prolog> 
-?- X is 2 + 2. 
-?- X is 2 * 3. 
-?- X is 4 / 2. 
-?- X is 4 / 3. 
-?- X is 4 // 3. 
-</​code>​ 
-Uwaga na //​podstawianie//:​ 
- 
-<code prolog> 
-?- X is 2 + 5. 
-?- X = 2 + 5. 
-?- 2 + 5 =:= 1 + 4. 
-?- 2 + 5 =:= 3 + 4. 
-?- 2 + 5 =:= 4 + 4. 
-</​code>​ 
- 
-Przećwiczyć użycie operatorów:​ 
- 
-<code prolog> 
-?- 2 < 3. 
-?- 2 > 3. 
-?- 3 > 3. 
-?- 3 >= 3. 
-?- 3 =< 3. 
-</​code>​ 
- 
-Napisz program obliczający wynik [[http://​pl.wikipedia.org/​wiki/​R%C3%B3wnanie_kwadratowe|równania kwadratowego]] ([[wp>​Quadratic Equation]]) ''​ax^2 + bx + c = 0''​ w dziedzinie liczb rzeczywistych. 
-Zaimplementuj predykaty: ​ 
-  * ''​delta/​4''​ -- obliczający deltę, argumenty kolejno: a, b, c, wynik, 
-  * ''​kwadrat/​4''​ -- obliczający wynik równania kwadratowego,​ argumenty kolejno: a, b, c, wynik. 
-Zwróć uwagę na niedeterminizm w predykacie ''​kwadrat/​4'',​ który znajduje zero, jedno, albo dwa rozwiązania;​ mogą się przydać [[http://​gollem.science.uva.nl/​SWI-Prolog/​Manual/​arith.html|funkcje matematyczne]]. ​ 
- 
-==== 2.7 Ćwiczenie: Prosty system ekspertowy ==== 
- 
- 
-Przetestować działanie systemu. System diagnozuje przyczyną awarii samochodu. 
- 
-Kod systemu znajduje sie w pliku {{car.pl}} 
- 
-Dodatkowo korzysta on z pliku {{getyesno.pl}} 
- 
-W systemie ekspertowym można wyróżnić następujące elementy: 
- 
-  * baza wiedzy, czasami dzielona na: właściwą bazę wiedzy (czyli tą którą system dysponuje stale, od początku/​uruchomienia) i bazę faktów, które system odkrywa, dostaje, wypracowuje, ​ 
-  * mechanizm wnioskujący,​ który przeprowadza właściwy proces wnioskowania,​ tj. odnajduje rozwiązanie/​odpowiedź ​ 
-  * mechanizm wyjaśniający,​ dlaczego jest to odpowiedź poprawna/​dopuszczalna, ​ 
-  * interfejs użytkownika,​ pozwalający na komunikację z systemem. ​ 
- 
-Rysunek 1: Struktura Systemu Ekspertowego. 
- 
-{{expert-systems-arch.png}} 
- 
-W przypadku tego systemu te elementy są odwzorowane przez: 
- 
-  * predykat //​defect_may_be/​1//​ 
-  * predykat //​try_all_possibilities/​0//,​ oraz mechanizm wnioskujący Prologu 
-  * predykat //​explain/​1//​ 
-  * predykaty //​ask_question/​1//​ i //​user_says/​2//​. 
- 
-====== Obserwacje ====== 
- 
-W Prologu negacja opiera się o //Closed World Assumption//​! 
- 
-W Prologu nie ma dualizmu "​dane/​kod"​ -> w Prologu jest jedna //baza wiedzy//, zawierająca fakty i reguły, którą można dynamicznie modyfikować. 
- 
-====== Komentarze ====== 
-Z braku lepszego miejsca tutaj studenci wpisują komentarze natury ogólnej do tego lab. 8-) 
- 
- --- //​[[gjn@agh.edu.pl|Grzegorz J. Nalepa]] 2008/02/20 14:34// 
pl/prolog/prolog_lab/prolog_lab_2.1224255637.txt.gz · ostatnio zmienione: 2019/06/27 15:59 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0