Programowanie w Logice Przykłady programów. Przemysław Kobylański

Podobne dokumenty
Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

Programowanie w Logice

Programowanie w Logice

Programowanie w logice

Visual Basic for Application (VBA)

Programowanie w Logice Wejście i wyjście (Lista 5)

Komentarze w PHP (niewykonywane fragmenty tekstowe, będące informacją dla programisty)

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

Systemy ekspertowe i ich zastosowania. Katarzyna Karp Marek Grabowski

Warunki logiczne instrukcja if

LOGIKA I TEORIA ZBIORÓW

Podstawy programowania funkcjonalnego

Przeszukiwanie z nawrotami. Wykład 8. Przeszukiwanie z nawrotami. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 238 / 279

Visual Basic for Application (VBA)

3. Instrukcje warunkowe

Wstęp do Programowania potok funkcyjny

Programowanie w Logice Struktury danych (Lista 2)

PODSTAWY SZTUCZNEJ INTELIGENCJI

Programowanie w Logice

SQL, LIKE, IN, CASE, EXISTS. Marcin Orchel

Odczyt danych z klawiatury Operatory w Javie

Treść wykładu. Pierścienie wielomianów. Dzielenie wielomianów i algorytm Euklidesa Pierścienie ilorazowe wielomianów

Paradygmaty programowania

Programowanie komputerowe. Zajęcia 1

Logika Temporalna i Automaty Czasowe

Prolog 2 (Filip Wroński, Łukasz Betkowski, Paweł Świerblewski, Konrad Kosmatka)

Operacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.

Projekt 4: Programowanie w logice

Kiedy i czy konieczne?

Programowanie w logice Prolog 2

Pętla for. Wynik działania programu:

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Plan wynikowy z wymaganiami edukacyjnymi z przedmiotu matematyka w zakresie rozszerzonym dla klasy I liceum ogólnokształcącego

Struktura pliku projektu Console Application

Wstęp do programowania

Algorytmy i struktury danych

PL/SQL. Część 1 Bloki PL/SQL. Piotr Medoń

Metalogika (1) Jerzy Pogonowski. Uniwersytet Opolski. Zakład Logiki Stosowanej UAM

Podstawy Programowania Podstawowa składnia języka C++

Języki formalne i techniki translacji

Wstęp do informatyki. stęp do informatyki Polecenia (cz.2)

Programowanie w Logice Środowisko programowania i dialog z systemem (Lista 0)

Arytmetyka liczb binarnych

Języki programowania deklaratywnego

Python wstęp do programowania dla użytkowników WCSS

Podstawy programowania w Pythonie

Wprowadzenie do Sztucznej Inteligencji Laboratorium lista 0.1 Elementy języka Prolog: fakty i zapytania. Przemysław Kobylański

Programowanie w logice

Języki i metody programowania

PROGRAMOWANIE W PYTHONIE OD PIERWSZYCH KROKÓW

Materiały pomocnicze do wykładu 3 - Elementy języka Java

Lekcja 3: Elementy logiki - Rachunek zdań

Wykład 2. Informatyka Stosowana. 8 października 2018, M. A-B. Informatyka Stosowana Wykład 2 8 października 2018, M. A-B 1 / 41

Visual Basic for Application (VBA)

Logika Temporalna i Automaty Czasowe

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 2. Programowanie komputerowe

Pętla for. Matematyka dla ciekawych świata -19- Scilab. for i=1:10... end. for k=4:-1:1... end. k=3 k=4. k=1. k=2

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

Właściwości i metody obiektu Comment Właściwości

JAVAScript w dokumentach HTML - przypomnienie

Wstęp do programowania

Lekcja 1. Składnia języka zmienne i podstawowe instrukcje PHP. Do wyświetlania tekstu służy instrukcja echo echo Hello world ;

Rachunek zdań i predykatów

Programowanie. Pascal - język programowania wysokiego poziomu. Klasa 2 Lekcja 9 PASCAL

Ciała i wielomiany 1. przez 1, i nazywamy jedynką, zaś element odwrotny do a 0 względem działania oznaczamy przez a 1, i nazywamy odwrotnością a);

Wstęp do Informatyki i Programowania (kierunek matematyka stosowana)

Programowanie w Logice Gramatyki metamorficzne. Przemysław Kobylański na podstawie [CM2003] i [SS1994]

Operatory cd. Relacyjne: ==!= < > <= >= bool b; int i =10, j =20; dzielenie całkowitych wynik jest całkowity! Łączenie tekstu: + string s = "Ala ma ";

Wprowadzenie do języka Java

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

Język skryptowy: Laboratorium 1. Wprowadzenie do języka Python

Testowanie oprogramowania

Wprowadzenie do Sztucznej Inteligencji Laboratorium lista 0.2 Elementy języka Prolog: reguły i rekurencja. Przemysław Kobylański

Wstęp do programowania. Różne różności

Programowanie Funkcyjne. Marcin Kubica Świder,

Wstęp do Informatyki i Programowania Laboratorium: Lista 1 Środowisko programowania

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

Wstęp do informatyki- wykład 5 Instrukcja selekcji if-else Operatory arytmetyczne i logiczne

Algorytmika i Programowanie VBA 1 - podstawy

Program znajduje największa lub najmniejsza z podanych liczb. Liczby podajemy dopóki nam sie nie znudzi.

Materiały pomocnicze do wykładu 3 - Elementy języka Java

ForPascal Interpreter języka Pascal

Instrukcje sterujące. Programowanie Proceduralne 1

Języki programowania Haskell

Zaawansowane algorytmy i struktury danych

WYRAŻENIA ALGEBRAICZNE

Podstawy Informatyki. Algorytmy i ich poprawność

Wykład 2. Relacyjny model danych

Języki programowania deklaratywnego

Wstęp do Programowania potok funkcyjny

Podstawowe operacje arytmetyczne i logiczne dla liczb binarnych

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Wstęp do programowania. Listy. Piotr Chrząstowski-Wachtel

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

C++ wprowadzanie zmiennych

Programowanie w logice Wykład z baz danych dla

Podstawy programowania w języku C

Podstawy i języki programowania

wiczenie 1 Podstawy j zyka Java. Instrukcje warunkowe

Transkrypt:

Programowanie w Logice Przykłady programów Przemysław Kobylański

Język Imperator 1 jest prostym językiem imperatywnym. Jego składnię opisuje poniższa gramatyka BNF: PROGRAM ::= PROGRAM ::= INSTRUKCJA ; PROGRAM INSTRUKCJA ::= IDENTYFIKATOR := WYRAŻENIE INSTRUKCJA ::= read IDENTYFIKATOR INSTRUKCJA ::= write WYRAŻENIE INSTRUKCJA ::= if WARUNEK then PROGRAM fi INSTRUKCJA ::= if WARUNEK then PROGRAM else PROGRAM fi INSTRUKCJA ::= while WARUNEK do PROGRAM od 1 Nazwę zaproponował MKI.

WYRAŻENIE ::= SKŁADNIK + WYRAŻENIE WYRAŻENIE ::= SKŁADNIK - WYRAŻENIE WYRAŻENIE ::= SKŁADNIK SKŁADNIK ::= CZYNNIK * SKŁADNIK SKŁADNIK ::= CZYNNIK / SKŁADNIK SKŁADNIK ::= CZYNNIK mod SKŁADNIK SKŁADNIK ::= CZYNNIK CZYNNIK ::= IDENTYFIKATOR CZYNNIK ::= LICZBA_NATURALNA CZYNNIK ::= ( WYRAŻENIE )

WARUNEK ::= KONIUNKCJA or WARUNEK WARUNEK ::= KONIUNKCJA KONIUNKCJA ::= PROSTY and KONIUNKCJA KONIUNKCJA ::= PROSTY PROSTY ::= WYRAŻENIE = WYRAŻENIE PROSTY ::= WYRAŻENIE /= WYRAŻENIE PROSTY ::= WYRAŻENIE < WYRAŻENIE PROSTY ::= WYRAŻENIE > WYRAŻENIE PROSTY ::= WYRAŻENIE >= WYRAŻENIE PROSTY ::= WYRAŻENIE =< WYRAŻENIE PROSTY ::= ( WARUNEK )

Example (Obliczenie sumy liczb A i B) read A; read B; X := A; Y := B; while Y > 0 do X := X + 1; Y := Y - 1; od; write X;

Program reprezentowany jest listą złożoną z termów. Każdy term reprezentuje jedną instrukcję. Jeśli instrukcja jest złożona, to term zawiera jako podterm listę termów reprezentujących zagnieżdżone instrukcje. PROGRAM = [ ] PROGRAM = [INSTRUKCJA PROGRAM] INSTRUKCJA = assign(id, WYRAŻENIE) INSTRUKCJA = read(id) INSTRUKCJA = write(wyrażenie) INSTRUKCJA = if(warunek, PROGRAM) INSTRUKCJA = if(warunek, PROGRAM, PROGRAM) INSTRUKCJA = while(warunek, PROGRAM)

Wyrażenie jest albo prostym wyrażeniem będącym zmienną lub liczbą naturalną albo wyrażeniem złożonym będącym sumą, różnicą, iloczynem lub ilorazem dwóch wyrażeń: WYRAŻENIE = id(id) WYRAŻENIE = int(num) WYRAŻENIE = WYRAŻENIE + WYRAŻENIE WYRAŻENIE = WYRAŻENIE - WYRAŻENIE WYRAŻENIE = WYRAŻENIE * WYRAŻENIE WYRAŻENIE = WYRAŻENIE / WYRAŻENIE WYRAŻENIE = WYRAŻENIE mod WYRAŻENIE

Warunek jest relacją równości, różności, mniejszości, większości (słabej lub silnej) między wartościami dwóch wyrażeń albo alternatywą lub koniunkcją dwóch warunków: WARUNEK = WYRAŻENIE =:= WYRAŻENIE WARUNEK = WYRAŻENIE =\= WYRAŻENIE WARUNEK = WYRAŻENIE < WYRAŻENIE WARUNEK = WYRAŻENIE > WYRAŻENIE WARUNEK = WYRAŻENIE =< WYRAŻENIE WARUNEK = WYRAŻENIE >= WYRAŻENIE WARUNEK = WARUNEK ; WARUNEK WARUNEK = WARUNEK, WARUNEK

Example (Sumowanie liczb od 1 do N) program1 ( [ read ( N ), a s s i g n ( SUM, i n t ( 0 ) ), w h i l e ( i d ( N ) > i n t ( 0 ), [ a s s i g n ( SUM, i d ( SUM ) + i d ( N ) ), a s s i g n ( N, i d ( N ) i n t ( 1 ) ) ] ), write ( i d ( SUM ) ) ] ).

Example (Obliczenie ilorazu D i reszty R z dzielenia M przez N) program2 ( [ read ( M ), read ( N ), a s s i g n ( D, i n t ( 0 ) ), a s s i g n ( R, i d ( M ) ), w h i l e ( i d ( R ) > i d ( N ), [ a s s i g n ( D, i d ( D ) + i n t ( 1 ) ), a s s i g n ( R, i d ( R ) i d ( N ) ) ] ), write ( i d ( D ) ), write ( i d ( R ) ) ] ).

Bieżący stan obliczeń zapisywać będziemy w postaci listy asocjacji. Każda asocjacja jest termem w postaci ID = Wartość, gdzie ID jest nazwą zmiennej a Wartość jest bieżącą wartością tej zmiennej. % podstaw(+ Stare, +ID, +Wartosc, Nowe) podstaw ( [ ], ID, N, [ ID = N ] ). podstaw ( [ ID=_ AS ], ID, N, [ ID=N AS ] ) :!. podstaw ( [ ID1=W1 AS1 ], ID, N, [ ID1=W1 AS2 ] ) : podstaw (AS1, ID, N, AS2 ). % p o b i e r z (+ A s o c j a c j e, +ID, Wartosc ) p o b i e r z ( [ ID=N _ ], ID, N) :!. p o b i e r z ( [ _ AS ], ID, N) : p o b i e r z (AS, ID, N).

% w a r t o sc(+wyrazenie, +A s o c j a c j e, Wartosc ) w a r t o sc ( i n t (N), _, N). w a r t o sc ( i d ( ID ), AS, N) : p o b i e r z (AS, ID, N). w a r t o sc (W1 + W2, AS, N) : w artosc (W1, AS, N1 ), w a r t o s c (W2, AS, N2 ), N i s N1 + N2. w a r t o sc (W1 W2, AS, N) : w artosc (W1, AS, N1 ), w a r t o s c (W2, AS, N2 ), N i s N1 N2.

w a r t o sc (W1 W2, AS, N) : w artosc (W1, AS, N1 ), w a r t o s c (W2, AS, N2 ), N i s N1 N2. w a r t o sc (W1 / W2, AS, N) : w artosc (W1, AS, N1 ), w a r t o s c (W2, AS, N2 ), N2 =\= 0, N i s N1 d i v N2. w a r t o sc (W1 mod W2, AS, N) : w artosc (W1, AS, N1 ), w a r t o s c (W2, AS, N2 ), N2 =\= 0, N i s N1 mod N2.

% prawda(+warunek, +A s o c j a c j e ) prawda (W1 =:= W2, AS) : w artosc (W1, AS, N1 ), w a r t o s c (W2, AS, N2 ), N1 =:= N2. prawda (W1 =\= W2, AS) : w artosc (W1, AS, N1 ), w a r t o s c (W2, AS, N2 ), N1 =\= N2. prawda (W1 < W2, AS) : w artosc (W1, AS, N1 ), w a r t o s c (W2, AS, N2 ), N1 < N2. prawda (W1 > W2, AS) : w artosc (W1, AS, N1 ), w a r t o s c (W2, AS, N2 ), N1 > N2.

prawda (W1 >= W2, AS) : w artosc (W1, AS, N1 ), w a r t o s c (W2, AS, N2 ), N1 >= N2. prawda (W1 =< W2, AS) : w artosc (W1, AS, N1 ), w a r t o s c (W2, AS, N2 ), N1 =< N2. prawda ( (W1, W2), AS) : prawda (W1, AS ), prawda (W2, AS ). prawda ( (W1; W2), AS) : ( prawda (W1, AS ),! ; prawda (W2, AS ) ).

% i n t e r p r e t e r (+Program, +A s o c j a c j e ) i n t e r p r e t e r ( [ ], _ ). i n t e r p r e t e r ( [ read ( ID ) PGM], AS) :!, read (N), i n t e g e r (N), podstaw (AS, ID, N, AS1 ), i n t e r p r e t e r (PGM, AS1 ). i n t e r p r e t e r ( [ write (W) PGM], AS) :!, w artosc (W, AS, WART), write (WART), nl, i n t e r p r e t e r (PGM, AS ). i n t e r p r e t e r ( [ a s s i g n ( ID, W) PGM], AS) :!, w artosc (W, AS, WAR), podstaw (AS, ID, WAR, AS1 ), i n t e r p r e t e r (PGM, AS1 ).

i n t e r p r e t e r ( [ i f (C, P) PGM], ASO) :!, i n t e r p r e t e r ( [ i f (C, P, [ ] ) PGM], AS ). i n t e r p r e t e r ( [ i f (C, P1, P2 ) PGM], AS) :!, ( prawda (C, AS) > append ( P1, PGM, DALEJ) ; append (P2, PGM, DALEJ ) ), i n t e r p r e t e r (DALEJ, AS ). i n t e r p r e t e r ( [ w h i l e (C, P) PGM], AS) :!, append (P, [ w h i l e (C, P ) ], DALEJ ), i n t e r p r e t e r ( [ i f (C, DALEJ) PGM], AS ). % i n t e r p r e t e r (+Program ) i n t e r p r e t e r (PROGRAM) : i n t e r p r e t e r (PROGRAM, [ ] ).

Example (Sumowanie)?- program1(x), interpreter(x). : 10. 55 X = [read( N ), assign( SUM, int(0)), while(id( N )>int(0), [assign( SUM, id( SUM ) +id( N )), assign( N, id( N )-int(1))]), write(id( SUM ))].

Example (Iloraz i reszta)?- program2(x), interpreter(x). : 123. : 13. 9 6 X = [read( M ), read( N ), assign( D, int(0)), assign( R, id( M )), while(id( R )>id( N ), [assign( D, id(...)+int(...)), assign( R,... -...)]), write(id( D )), write(id( R ))].?- X is 9*13+6. X = 123.

Interpreter podzbioru Prologu w Prologu Zakładamy, że predykaty zapisane są w postaci klauzul, których ciała zawierają tylko koniunkcje formuł atomowych (nie ma negacji, alternatyw i implikacji). Wszystkie predykaty są zdefiniowane przez nas (nie korzystamy z predykatów wbudowanych, które mogą być napisane np. w języku C).

Interpreter podzbioru Prologu w Prologu Example (Konkatenacja list na liście) app ( [ ], X, X ). app ( [ X L1 ], L2, [X L3 ] ) : app ( L1, L2, L3 ). app ( [ ], [ ] ). app ( [ L1 L2 ], L3 ) : app ( L1, L4, L3 ), app ( L2, L4 ).

Interpreter podzbioru Prologu w Prologu Predykat clause(h, B) dostarcza głowę H i ciało B klauzuli. H jest unifikowane z głową a B z ciałem klauzuli. Fakt ma ciało równe true.?- clause(app([], A, B), C). A = B, C = true.?- clause(app(a, B, C), D). A = [], B = C, D = true ; A = [_G4888 _G4889], C = [_G4888 _G4892], D = app(_g4889, B, _G4892).

Interpreter podzbioru Prologu w Prologu?- clause(app(a, B), C). A = B, B = [], C = true ; A = [_G4870 _G4871], C = (app(_g4870, _G4874, B), app(_g4871, _G4874)).

Interpreter podzbioru Prologu w Prologu Interpreter Prologu w Prologu zapiszemy w postaci predykatu udowodnij(cel), gdzie Cel jest zadanym celem do udowodnienia. udowodnij ( true ) :!. udowodnij ( ( G1, G2 ) ) :!, udowodnij (G1 ), udowodnij (G2 ). udowodnij (A) : clause (A, B), udowodnij (B ).

Interpreter podzbioru Prologu w Prologu?- udowodnij(app(x, Y, [1, 2, 3])). X = [], Y = [1, 2, 3] ; X = [1], Y = [2, 3] ; X = [1, 2], Y = [3] ; X = [1, 2, 3], Y = [] ; false.

Interpreter podzbioru Prologu w Prologu?- udowodnij(app([1, 2, 3], X, [1, 2, 3, 4 Y])). X = [4 Y].?- udowodnij(app([[1, 2], [3], [4, 5]], X)). X = [1, 2, 3, 4, 5].