Projekt 4: Programowanie w logice

Podobne dokumenty
Języki programowania Prolog

Programowanie w logice

Programowanie w logice Prolog 2

Paradygmaty programowania

I. Podstawowe pojęcia i oznaczenia logiczne i mnogościowe. Elementy teorii liczb rzeczywistych.

Programowanie deklaratywne

LOGIKA I TEORIA ZBIORÓW

Elementy logiki matematycznej

PROLOG. Prolog. Programowanie, W.F. Clocksin, C.S. Mellish, HELION Prolog, język sztucznej inteligencji, Eugeniusz Gatnar, Katarzyna Stąpor, Wyd.

Logika Temporalna i Automaty Czasowe

Mathcad c.d. - Macierze, wykresy 3D, rozwiązywanie równań, pochodne i całki, animacje

Ćwiczenie 1. Matlab podstawy (1) Matlab firmy MathWorks to uniwersalny pakiet do obliczeń naukowych i inżynierskich, analiz układów statycznych

PODSTAWY SZTUCZNEJ INTELIGENCJI

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

CLP Programowanie logiczne z ograniczeniami.

Pole wielokąta. Wejście. Wyjście. Przykład

Kwerendy (zapytania) wybierające

Podstawy i języki programowania

ROZDZIAŁ 1. Rachunek funkcyjny

Obliczenia iteracyjne

Programowanie deklaratywne

4. Funkcje. Przykłady

Przestrzenie liniowe

Teoria gier. Jakub Cisło. Programowanie z pasją maja 2019

f (x)=mx 2 +(2m 2)x+m+1 ma co najmniej jedno

0.1. Logika podstawowe pojęcia: zdania i funktory, reguły wnioskowania, zmienne zdaniowe, rachunek zdań.

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

Jest to zasadniczo powtórka ze szkoły średniej, być może z niektórymi rzeczami nowymi.

R n = {(x 1, x 2,..., x n ): x i R, i {1,2,...,n} },

Podstawy programowania skrót z wykładów:

BOGDAN ZARĘBSKI ZASTOSOWANIE ZASADY ABSTRAKCJI DO KONSTRUKCJI LICZB CAŁKOWITYCH

Programowanie w Logice

Arytmetyka liczb binarnych

Programowanie deklaratywne

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Ćwiczenie 1. Wprowadzenie do programu Octave

1 Podstawowe oznaczenia

Programowanie w języku Python. Grażyna Koba

Wprowadzenie do programu Mathcad 15 cz. 1

Języki programowania zasady ich tworzenia

Indukcja. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

Wprowadzenie do Prologa

Programowanie w języku C++ Grażyna Koba

Definicje wyższego poziomu

Laboratorium przedmiotu Paradygmaty Programowania

Algorytm. a programowanie -

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

Podstawowe operacje arytmetyczne i logiczne dla liczb binarnych

Semantyka rachunku predykatów

Układy równań i nierówności liniowych

Wykład 11a. Składnia języka Klasycznego Rachunku Predykatów. Języki pierwszego rzędu.

Logika binarna. Prawo łączności mówimy, że operator binarny * na zbiorze S jest łączny gdy (x * y) * z = x * (y * z) dla każdego x, y, z S.

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

Skrypty powłoki Skrypty Najcz ciej u ywane polecenia w skryptach:

1 Podstawy c++ w pigułce.

WYRAŻENIA ALGEBRAICZNE

Ziemia obraca się wokół Księżyca, bo posiadając odpowiednią wiedzę można stwierdzić, czy są prawdziwe, czy fałszywe. Zdaniami nie są wypowiedzi:

Podstawy programowania Laboratorium. Ćwiczenie 2 Programowanie strukturalne podstawowe rodzaje instrukcji

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

Liczby losowe i pętla while w języku Python

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

znalezienia elementu w zbiorze, gdy w nim jest; dołączenia nowego elementu w odpowiednie miejsce, aby zbiór pozostał nadal uporządkowany.

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Programowanie w Logice Struktury danych (Lista 2)

Definicja i własności wartości bezwzględnej.

Edytor tekstu MS Word 2010 PL. Edytor tekstu MS Word 2010 PL umożliwia wykonywanie działań matematycznych.

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

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Podstawy programowania C. dr. Krystyna Łapin

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

12.Rozwiązywanie równań i nierówności liniowych oraz ich układów.

1 Całki funkcji wymiernych

Prolog (Pro-Logic) Programowanie w Logice. Dr inż. Piotr Urbanek

Np. Olsztyn leży nad Łyną - zdanie prawdziwe, wartość logiczna 1 4 jest większe od 5 - zdanie fałszywe, wartość logiczna 0

Języki formalne i automaty Ćwiczenia 6

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

PROGRAMOWANIE W PYTHONIE OD PIERWSZYCH KROKÓW

Luty 2001 Algorytmy (7) 2000/2001

FUNKCJA KWADRATOWA. 1. Definicje i przydatne wzory. lub trójmianem kwadratowym nazywamy funkcję postaci: f(x) = ax 2 + bx + c

2. DZIAŁANIA NA WIELOMIANACH

Podstawy Informatyki. Algorytmy i ich poprawność

Programowanie komputerowe. Zajęcia 1

Logika Temporalna i Automaty Czasowe

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Języki programowania deklaratywnego

AKADEMIA MORSKA W SZCZECINIE WI-ET / IIT / ZTT. Instrukcja do zajęc laboratoryjnych nr 3 AUTOMATYZACJA I ROBOTYZACJA PROCESÓW PRODUKCYJNYCH

Podstawowe struktury algebraiczne


Rozdział 1 PROGRAMOWANIE LINIOWE

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

Grupy. Permutacje 1. (G2) istnieje element jednostkowy (lub neutralny), tzn. taki element e G, że dla dowolnego a G zachodzi.

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

zdarzenie losowe - zdarzenie którego przebiegu czy wyniku nie da się przewidzieć na pewno.

Wstęp do informatyki- wykład 2

Liczby rzeczywiste. Działania w zbiorze liczb rzeczywistych. Robert Malenkowski 1

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

opisuje nazwy kolumn, wyrażenia arytmetyczne, funkcje nazwy tabel lub widoków warunek (wybieranie wierszy)

MATLAB tworzenie własnych funkcji

LOGIKA MATEMATYCZNA. Poziom podstawowy. Zadanie 2 (4 pkt.) Jeśli liczbę 3 wstawisz w miejsce x, to które zdanie będzie prawdziwe:

Transkrypt:

Języki Programowania Projekt 4: Programowanie w logice Środowisko ECL i PS e W projekcie wykorzystane będzie środowisko ECL i PS e. Dostępne jest ono pod adresem http://eclipseclp.org/. Po zainstalowaniu środowiska będziemy mieli dostępne dwie jego wersje: konsolową (dla systemu Windows jest to <kataloginstalacji>\lib\i386_nt\eclipse.exe) i graficzną (TkEclipse). Po utworzeniu pliku z programem (w ulubionym edytorze lub przy pomocy File->Edit new) możemy go skompilować poleceniem File->Compile lub wpisując [<nazwa-pliku-bez-rozszerzenia>]. w polu Query Entry (w tym wypadku plik powinien mieć rozszerzenie.pl i znajdować się w bieżącym katalogu). Zapytania wpisujemy w polu Query Entry. Programowanie w logice Program w języku PROLOG składa się z zestawu definicji klauzul. Najprostsza definicja klauzuli p/1 (1 oznacza liczbę parametrów klauzuli) ma postać: p(1). Oznacza ona, że klauzula ta jest spełniona dla parametru równego 1 (i tylko dla takiego). Jeżeli teraz wykonamy zapytanie: p(x). otrzymamy odpowiedź: X = 1 Yes Po zadaniu zapytania PROLOG przegląda wszystkie zdefiniowane klauzule i próbuje dopasować do nich zapytanie. Na przykład, gdy p jest spełnione dla 1 i 2: p(1). p(2). > p(x) X = 1 \\ Yes, maybe more X = 2 \\ Yes, maybe more Ogólna definicja klauzuli ma postać: predykat(zmienne) :- cel.

i oznacza, że klauzula dla zmiennych Zmienne jest spełniona, jeżeli spełniony jest cel, przy czym cel jest listą pod-celi połączonych koniunkcją (w postaci cel-1, cel- 2,, cel-n) lub alternatywą (w postaci (cel-1; cel-2; ; cel-n)). Np. klauzula: q( 0,0 ). q( X,Y ) :- X > 0, T is X 1, q( T,Y ). jest spełniona dla parametrów 0,0 oraz dla wszystkich X,Y takich, że q( X-1,Y ) jest spełnione. Do obliczenia wartości wyrażenia potrzebna jest klauzula is/2. W przeciwnym wypadku zmiennej logicznej T zostałoby przypisane wyrażenie symboliczne X 1. Klauzule postaci p(x). (tzn. z pustą listą celów) nazywamy faktami, pozostałe klauzule regułami. Zadajmy teraz zapytanie q( 7,0 ). Nie udało się go dopasować do pierwszej klauzuli, jednak dopasowanie do drugiej powiedzie się: zmienna X zostanie związana z wartością 7, Y zaś z zerem, po czym nastąpi sprawdzenie prawdziwości pod-celi. Pierwsze dwa są spełnione. Aby sprawdzić prawdziwość trzeciego pod-celu, należy sprawdzić, czy p( 6,0 ) jest prawdziwe. Nastąpi ponowna próba dopasowania zapytania (tym razem p( 6,0 )). Będzie ono prawdziwe, jeżeli prawdziwe będzie p( 5,0 ) itd., aż do zapytania p( 0,0 ), które jest prawdziwe z definicji (pierwszy fakt). Listy W PROLOGu często wykonujemy operacje na listach. Lista jest uporządkowanym ciągiem elementów zawartych między nawiasami kwadratowymi i rozdzielonych przecinkami, np.: [ 1,2,3,5 ]. Szczególnym przypadkiem jest pusta lista, oznaczana przy pomocy []. Każda niepusta lista skonstruowana jest z głowy (pierwszego elementu) i ogona (listy pozostałych elementów, potencjalnie pustej). Konstrukcja listy z głowy H i ogona T ma postać [H T]. Zatem lista [ 1,2,3 ] może być zapisana na jeden z równoważnych sposobów: [ 1,2,3 ] [1 [ 2,3 ]] [1 [2 [3]]] [1 [2 [3 []]]] Przykładowy predykat, wyznaczający długość listy ma postać: dlugosc( [],0 ). dlugosc( [_ T],L ) :- dlugosc( T,P ), L is P + 1. czyli długością pustej listy jest zero, zaś lista niepusta ma długość o jeden większą niż długość jej ogona. _ oznacza, że głowy listy nie wiążemy z żadną zmienną logiczną. Kolejny przykład dołączenie jednej listy na koniec drugiej: dolacz( [],L,L ). dolacz( [H T],L,[H X] ) :- dolacz( T,L,X ).

Lista L dołączona do pustej listy daje listę L. Lista L dołączona na koniec listy składającej się z głowy H i ogona T tworzy listę zbudowaną z głowy H i ogona X będącego wynikiem dołączenia na koniec T listy L. Kolejny przykład sprawdzenie, czy X jest równy jednemu z elementów listy: nalezy( X,[X _] ). nalezy( X,[H T] ) :- nalezy( X,T ). Komentarze Komentarze w PROLOGu zawarte są pomiędzy /* i */ (jak w C) lub pomiędzy % a końcem linii, np.: p(1). /* to jest komentarz */ p(2). % to tez jest komentarz Programowanie z ograniczeniami Aby wykorzystać programowanie z ograniczeniami, należy zaimportować bibliotekę ic, przy pomocy polecenia (podanego na początku programu): :- lib(ic). Typowe rozwiązanie problemu przy użyciu CLP ma postać: rozwiaz(zmienne):- wczytaj_dane(dane), ustaw_ograniczenia( Dane,Zmienne ), labeling(zmienne). gdzie ustaw_ograniczenia/2 definiuje model problemu. Predykat labeling/1 próbuje znaleźć rozwiązania sprawdzając wszystkie podstawienia dla zmiennych. Rozważmy następujący problem, w którym mamy 8 zmiennych: S, E, N, D, M, O, R, Y, każda z nich oznacza inną cyfrę, oraz spełniona jest równość: S E N D + M O R E = M O N E Y Rozwiązanie tego problemu będzie miało postać: :- lib(ic). model(zmienne) :- Zmienne = [ S,E,N,D,M,O,R,Y ], Zmienne :: 0..9, alldifferent(zmienne), S #\= 0, M #\= 0, 1000 * S + 100 * E + 10 * N + D + 1000 * M + 100 * O + 10 * R + E #= 10000 * M + 1000 * O + 100 * N + 10 * E + Y. rozwiaz(zmienne) :- model(zmienne), labeling(zmienne).

Predykat model najpierw tworzy listę zmiennych w naszym problemie. W drugim kroku przypisujemy wszystkim zmiennym (przy pomocy predykatu ::/2) jako domenę zbiór liczb naturalnych z przedziału <0, 9>. Aby stworzyć domenę będącą podzbiorem liczb rzeczywistych, przedział 0..9 należałoby zmienić na 0.0..9.0 lub użyć predykatu $::/2. W następnej linii określamy, że wszystkie zmienne muszą być różne. Na koniec stwierdzamy że ani S ani M nie mogą być równe zero (ograniczenia wyrażone operatorami porównania tworzy się dodając znak # przed operatorem) oraz opisujemy nasze równanie. Zadania 1. Zaimplementuj predykat czy_posortowane( lista,odp ), stwierdzający, czy lista jest uporządkowana rosnąco (1 pkt.). Np.: > czy_posortowane( [1,2,3],ODP ) ODP = T > czy_posortowane( [6,2,3],ODP ) ODP = N 2. Zaimplementuj predykat czy_graficzny( lista,odp ), stwierdzający, czy lista tworzy ciąg graficzny (2.5 pkt.). 3. W wariancie gry Nim mamy 3 stosy kamieni. Dwóch graczy na przemian zdejmuje kamienie ze stosów i ten który wykona ostatni ruch (po jego ruchu nie zostaną żadne kamienie, lub drugi gracz nie może wykonać dozwolonego ruchu) przegrywa. Zaimplementuj predykat czy_( A,B,C ) stwierdzający, czy gracz, który wykonuje ruch dla odpowiednio A, B i C kamieni na stosach ma strategię jącą. (4 pkt). Dozwolone ruchy dla graczy to (według ostatniej cyfry numeru indeksu): 0) zdjęcie jednego lub dwóch kamieni z dowolnego stosu, 1) zdjęcie dwóch lub trzech kamieni z dowolnego stosu, 2) zdjęcie jednego kamienia z dowolnego stosu lub dwóch kamieni z różnych stosów, 3) zdjęcie jednego kamienia z dowolnego stosu i jednego kamienia z pierwszego stosu lub dwóch kamieni z dowolnego stosu, 4) zdjęcie po jednym kamieniu z każdego stosu lub zdjęcie dwóch kamieni z dowolnego stosu, 5) zdjęcie dwóch kamieni z drugiego stosu lub jednego kamienia z dowolnego stosu, 6) zdjęcie jednego kamienia z dowolnego stosu i przełożenie jednego kamienia ze stosu pierwszego na drugi lub zdjęcie dwóch kamieni z dowolnego stosu, 7) zdjęcie jednego kamienia z dowolnego stosu i przełożenie dwóch kamieni ze stosu pierwszego na trzeci lub zdjęcie dwóch kamieni z dowolnego stosu, 8) przełożenie jednego kamienia z pierwszego stosu na drugi i zdjęcie po jednym kamieniu z każdego stosu lub zdjęcie dwóch kamieni z drugiego stosu,

9) zamiana miejscami stosów drugiego i trzeciego i zdjęcie jednego kamienia ze stosu pierwszego, lub zdjęcie jednego kamienia z dowolnego stosu i jednego ze stosu trzeciego. Gracz A ma strategię jącą, gdy niezależnie od ruchów przeciwnika, odpowiednio wybierając posunięcia, zawsze wygra. Dla danego układu kamieni gracz A może przejść do takiego układu, że niezależnie od tego, jaki ruch wybierze gracz B, gracz A wygra. Sytuację taką można przedstawić w postaci drzewa (Si to kolejne stany gry): S1 gracz A lub i S2 gracz B S3 gracz B S4 gracz B S5 gracz A S6 gracz A S7 gracz A lub S8 gracz B S9 gracz B S10 gracz B Gdy gracz A wykonuje ruch, wystarczy, że tylko jeden z nich prowadzi do wygranej (LUB). Gdy gracz B wykonuje ruch wszystkie jego ruchy muszą prowadzić do wygranej A (AND; gdyby było inaczej, B mógłby przejść do stanu gry, w którym A nie ). Literatura http://www.eclipse-clp.org/ ECL i PS e A Tutorial Introduction (http://87.230.22.228/doc/tutorial.pdf) ECL i PS e User Manual (http://87.230.22.228/doc/userman.pdf)