Logika stosowana Ćwiczenia Programowanie w logice i PROLOG Marcin Szczuka Instytut Informatyki, Uniwersytet Warszawski Wykład monograficzny w semestrze letnim 2018/2019 Marcin Szczuka (MIMUW) Logika stosowana 2019 1 / 20
Plan wykładu 1 Czym jest programowanie w logice? Historia programowania w logice 2 Logika a programowanie Programowanie w Prologu Przykład innego rodzaju Marcin Szczuka (MIMUW) Logika stosowana 2019 2 / 20
Aspekty programowania w logice Programowanie w logice (Logic Programming) jest alternatywnym sposobem tworzenia programów, które mają bardziej odpowiadać na pytania niż wykonywać operacje numeryczne; Programy tworzymy w języku (jakiejś) logiki; Wykonanie programu w logice odpowiada procesowi dowodzenia (wywodzenia) twierdzeń, tzn. kroki obliczenia są wykonywane za pomocą wnioskowań formalnych; Naczelnym przykładem języka programowania w logice jest PROLOG (PROgramming in LOGic). Marcin Szczuka (MIMUW) Logika stosowana 2019 3 / 20
Plan wykładu 1 Czym jest programowanie w logice? Historia programowania w logice 2 Logika a programowanie Programowanie w Prologu Przykład innego rodzaju Marcin Szczuka (MIMUW) Logika stosowana 2019 4 / 20
Krótka historia programowania w logice Idea programowania w logice wywodzi się z pewnych postulatów twórcy rachunku λ - Alonso Churcha (lata 30). W 1974 Robert Kowalski, profesor Uniwersytetu w Edynburgu, zaproponował by stworzyć metodę wywodzenia (SLD resolution) opartą na przeszukiwaniu. Taka rezolucja jest podstawą PROLOGU i jego pochodnych. Pierwszy prototyp proto-prologu powstał we Francji (ca. 1972). Pierwszy kompilator Prologu (David H. D. Warren) powstał w Edynburgu ok. 1975 roku. W latach 1982-1992 Japonia realizowała program komputera piątej generacji, który miał być myślącą maszyną i działać w oparciu o obliczenia symboliczne. Programowanie w logice (i Prolog) miały się stać jego silnikiem. Nie bardzo się udało. W tym tysiącleciu wydajność obliczeń w Prologu i podobnych językach znacząco się poprawiła, nadal jednak jest słabsza niż dla wielu innych języków. Powstały także interfejsy umożliwiające wykorzystywanie elementów Prologu w innych językach programowania. Marcin Szczuka (MIMUW) Logika stosowana 2019 5 / 20
Czemu Prolog nie podbił świata? Czemu Prolog nigdy nie zdobył popularności choćby zbliżonej do C/Javy/Pythona? Początkowo był błędnie brany za rodzaj uniwersalnego języka programowania. To był kosztowny błąd. Nigdy nie był i raczej nigdy nie będzie równie wydajny jak np. C/C++. Wsparcie dla Prologu wymaga zasobów i środków, których firmy nie są gotowe poświęcić. Pomimo wielu działań wartość rozwiązań opartych na Prologu nie została nigdy zauważona przez przemysł IT. Marcin Szczuka (MIMUW) Logika stosowana 2019 6 / 20
Plan wykładu 1 Czym jest programowanie w logice? Historia programowania w logice 2 Logika a programowanie Programowanie w Prologu Przykład innego rodzaju Marcin Szczuka (MIMUW) Logika stosowana 2019 7 / 20
Czym jest logika? Logika to język plus reguły wnioskowania. Ma składnię, semantykę i ścisłe reguły konstruowania hipotez. Składnia (Syntax): Zasady konstruowania formuł, zwykle najprostsza część logiki. Semantyka (Semantics): Zanczenie jakie niosą ze sobą formuły, głownie w sensie konsekwencji logicznej. Reguły wnioskowania (Inference rules): Opisują poprawny sposób wyznaczania wniosków (hypotheses, conclusions) z założeń (theory, premises). Marcin Szczuka (MIMUW) Logika stosowana 2019 8 / 20
Przykład wykorzystania wnioskowania Zadanie - mając informację o relacji bycia ojcem i matką wyznacz zależność bycia dziadkiem/wnukiem. Na przykład mając informację wyrażoną w postaci następujących faktów: John is father of Lily Kathy is mother of Lily Lily is mother of Bill Ken is father of Karen Odpowiedz na pytania: Kim są dziadkowie (babcie) Billa? (Who are grand parents of Bill?) Kto jest dziadkiem/babcią Karen? (Who are grand parents of Karen?) Marcin Szczuka (MIMUW) Logika stosowana 2019 9 / 20
Przykład w Prologu W Prologu nasze fakty zapisalibyśmy w następujący sposób father(john, lily). mother(kathy, lily). mother(lily, bill). father(ken, karen). Uwagi: 1 W logice wyrażenia takie jak father, mother w naszym przykładzie nazywamy predykatami. 2 Wyrażenia podające prawdziwe fakty, takie jak father(john, lily), nazywamy formułami atomowymi lub atomami. Marcin Szczuka (MIMUW) Logika stosowana 2019 10 / 20
Plan wykładu 1 Czym jest programowanie w logice? Historia programowania w logice 2 Logika a programowanie Programowanie w Prologu Przykład innego rodzaju Marcin Szczuka (MIMUW) Logika stosowana 2019 11 / 20
Programy jako formuły logiczne Mamy wyrazić relację bycia dziadkiem/babcią (grand parent relationship): grandparent(x,z) :- parent(x,y), parent(y,z). parent(x,y) :- father(x,y). parent(x,y) :- mother(x,y). Takie formuły w Prologu nazywamy wyrażeniami warunkowymi (conditional statements). Duże litery (X,Y,Z) oznaczają zmienne pod kwantyfikatorem ogólnym. Znaczek :- koduje implikację ( ). Na przykład pierwsza formuła oznacza: Dla każdych X,Y,Z jeśli X jest rodzicem Y i Y jest rodzicem Z to X jest dziadkiem/babcią Z. Marcin Szczuka (MIMUW) Logika stosowana 2019 12 / 20
Program w Prologu Zestawiając dwa poprzednie slajdy dostajemy program w Prologu: Program Grand Parent grandparent(x,z) :- parent(x,y), parent(y,z). parent(x,y) :- father(x,y). parent(x,y) :- mother(x,y). father(john, lily). mother(kathy, lily). mother(lily, bill). father(ken, karen). Marcin Szczuka (MIMUW) Logika stosowana 2019 13 / 20
Co potrafi Prolog? Po wprowadzeniu programu (faktów i reguł/predykatów) możemy zadawać pytania, np.?- grandparent(john,bill) W tym przypadku Prolog dokona wnioskowania i odpowie YES. Jeżeli natomiast zdamy pytanie:?- grandparent(q,karen) Pytanie to można rozumieć jako Kto jest dziadkiem/babcią Karen?". Odpowiedzią Prologu jest NO, bo nie ma przesłanek do udzielenia innej. Marcin Szczuka (MIMUW) Logika stosowana 2019 14 / 20
Co jeszcze potrafi Prolog? Możemy spytać kim są dziadkowie/babcie Billa (Who are the grand parents of Bill?) następująco:?- grandparent(q,bill) Odpowiedź: Q = john Q = kathy Możemy też spytać kto jest wnukiem Johna:?- grandparent(john,w) Odpowiedź: W = bill Marcin Szczuka (MIMUW) Logika stosowana 2019 15 / 20
Program w Prologu Możemy myśleć o programach w Prologu jako o listach instrukcji (klauzul) w postaci: A :- B1,...,Bn gdzie: A oraz B1,...,Bn są atomami; :- oznacza implikację ( ) z koniunkcji B1,...,Bn do A; jeśli prawa strona klauzuli jest pusta to piszemy po prostu A co oznacza że jest to fakt. Marcin Szczuka (MIMUW) Logika stosowana 2019 16 / 20
Przykład suma w Prologu Zadanie: Dla listy liczb całkowitych wyznaczyć jej sumę. Definiujemy predykat: sum(l,r) W tym predykacie L jest podaną listą liczb całkowitych, a R poszukiwanym wynikiem (sumą). Jeżeli napisalibyśmy nasz program poprawnie to na pytanie:?- sum([3,5,2],q) powinniśmy dostać odpowiedź: Q=10 Marcin Szczuka (MIMUW) Logika stosowana 2019 17 / 20
Program na sumę listy w Prologu Właściwy program na sumę w Prologu wygląda następująco: Program Suma sum([ ],0). sum([a L],R) :- R is A+R1, sum(l,r1). R is A+R1 jest sposobem na zapisanie w Prologu faktu R jest wynikiem dodania A do R1. [A L] jest notacją w Prologu oznaczającą listę której pierwszym elementem jest A a ogonem lista L. Dwie klauzule, z których składa się program możemy czytać jako: - Pusta lista ma sumę równą 0. - Suma liczb na liście jest wynikiem dodania pierwszego jej elementu (A) do sumy pozostałych. Jeżeli teraz zadamy pytanie?- sum([3,5,2],q) to dostaniemy oczekiwaną odpowiedź Q=10. Marcin Szczuka (MIMUW) Logika stosowana 2019 18 / 20
Plan wykładu 1 Czym jest programowanie w logice? Historia programowania w logice 2 Logika a programowanie Programowanie w Prologu Przykład innego rodzaju Marcin Szczuka (MIMUW) Logika stosowana 2019 19 / 20
Monty Python i Święty Graal W filmie z 1975 roku Monty Python i Święty Graal (https://pl.wikipedia.org/wiki/monty_python_i_święty_graal) jest scena (https://youtu.be/yp_l5ntikau) w której Sir Bedevere (Terry Jones) przeprowadza skomplikowane wnioskowanie logiczne prowadzące do uznania kobiety za czarownicę. Przeprowadzone tam wnioskowanie można przedstawić jako zadanie weryfikacji poprawności wywodu logicznego: https: //cs.uwaterloo.ca/~jhoey/montypythonwitchsceneanalysis.html http://www.cs.swan.ac.uk/~csneal/systemspec/different.html Można także zastanawiać się, czy takie rozumowanie da się zrealizować programem w Prologu. http://www.allisons.org/ll/logic/prolog/examples/witch/ https://github.com/risto-stevcev/prolog-monty-python Marcin Szczuka (MIMUW) Logika stosowana 2019 20 / 20