Prolog - Programming In Logic

Podobne dokumenty
Prolog- Programming In Logic

Rachunek zdań i predykatów

Programowanie w logice

PROLOG. Programmation en Logique. Michał Bereta

Laboratorium przedmiotu Paradygmaty Programowania

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

Rachunek zdań i predykatów

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

Wprowadzenie do Prologa

Celem ćwiczenia jest zapoznanie się z podstawowymi możliwościami języka Prolog w zakresie definiowania faktów i reguł oraz wykonywania zapytań.

PODSTAWY SZTUCZNEJ INTELIGENCJI

Programowanie deklaratywne

Programowanie w logice Wykład z baz danych dla

Logika stosowana. Ćwiczenia Programowanie w logice i PROLOG. Marcin Szczuka. Instytut Informatyki, Uniwersytet Warszawski

Programowanie deklaratywne

Deklarowania faktów dotyczących obiektów i związków między nimi. Definiowania reguł dotyczących obiektów i związków między nimi.

Podstawy języka PROLOG

Dariusz Banasiak. Instytut Informatyki, Automatyki i Robotyki. Politechniki Wrocławskiej

Programowanie w Logice

Prezentacja do pobranie:

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

Programowanie w logice Prolog 1

Systemy ekspertowe. Wnioskowanie w systemach regułowych. Część piąta. Autor Roman Simiński.

Adam Meissner.

5. OKREŚLANIE WARTOŚCI LOGICZNEJ ZDAŃ ZŁOŻONYCH

Paradygmaty programowania

Systemy ekspertowe i ich zastosowania. Katarzyna Karp Marek Grabowski

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

Programowanie w logice Prolog 2

Języki programowania deklaratywnego

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

Programowanie w logice

Internet Semantyczny i Logika I

Wykład 0 Informacje Podstawowe

Projekt 4: Programowanie w logice

Metoda tabel semantycznych. Dedukcja drogi Watsonie, dedukcja... Definicja logicznej konsekwencji. Logika obliczeniowa.

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

PRZEWODNIK PO PRZEDMIOCIE

Programowanie deklaratywne

Podstawy Sztucznej Inteligencji (PSZT)

Programowanie logiczne a negacja

Logika Stosowana. Wykład 7 - Zbiory i logiki rozmyte Część 3 Prawdziwościowa logika rozmyta. Marcin Szczuka. Instytut Informatyki UW

Wykład 1. Informatyka Stosowana. 3 października Informatyka Stosowana Wykład 1 3 października / 26

Dana jest baza: kobieta(katarzyna). kobieta(anna). kobieta(maria). kobieta(marianna). kobieta(marta). Zdefiniujemy predykat kobiety/0 następująco:

Programowanie w Logice Struktury danych (Lista 2)

PRZEWODNIK PO PRZEDMIOCIE


PRZEWODNIK PO PRZEDMIOCIE

MATEMATYKA DYSKRETNA, PODSTAWY LOGIKI I TEORII MNOGOŚCI

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

Programowanie deklaratywne i logika obliczeniowa

PRZEWODNIK PO PRZEDMIOCIE

CLP Programowanie logiczne z ograniczeniami.

Języki programowania deklaratywnego

Języki programowania zasady ich tworzenia

Rachunek zdań i predykatów

PROLOG INNE PRZYKŁADY MACIEJ KELM


Alfred N. Whitehead

Metoda Tablic Semantycznych

Program, który się uczy.

Lekcja 3: Elementy logiki - Rachunek zdań

Warto też w tym miejscu powiedzieć, że w C zero jest rozpoznawane jako fałsz, a wszystkie pozostałe wartości jako prawda.

Java Developers Day. Silniki reguł biznesowych

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Wprowadzenie do logiki Zdania, cz. III Język Klasycznego Rachunku Predykatów

Logika predykatów pierwszego rzędu PROLOG. Zarządzanie wiedzą. Wykład Reprezentacja wiedzy logika predykatów. Joanna Kołodziejczyk.

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

KARTA KURSU. Wstęp do programowania

Instytut Automatyki i Inżynierii Informatycznej Politechniki Poznańskiej. Adam Meissner. Elementy uczenia maszynowego

Zmienne i stałe w PHP

Wykład 4. Algorytmy i programy. Algorytmy + struktury danych = programy. Niklaus Wirth. Algorytm = logika + sterowanie.

Andrzej Wiśniewski Logika I Materiały do wykładu dla studentów kognitywistyki. Wykład 9. Koniunkcyjne postacie normalne i rezolucja w KRZ

Matematyczne podstawy informatyki Mathematical Foundations of Computational Sciences. Matematyka Poziom kwalifikacji: II stopnia

SZTUCZNA INTELIGENCJA

Semantyka rachunku predykatów

Programowanie w Logice

Składnia rachunku predykatów pierwszego rzędu

Logika Matematyczna (1)

Wstęp do programowania

Cel projektu: Wymogi dotyczące sprawozdania:

Zapisywanie algorytmów w języku programowania

Darmowy artykuł, opublikowany na:

LOGIKA Klasyczny Rachunek Zdań

Elementy logiki. Wojciech Buszkowski Wydział Matematyki i Informatyki UAM Zakład Teorii Obliczeń

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

Michał Lipnicki (UAM) Logika 11 stycznia / 20

Ćwiczenie numer 4 JESS PRZYKŁADOWY SYSTEM EKSPERTOWY.

PROGRAMOWANIE W PYTHONIE OD PIERWSZYCH KROKÓW

Podstawy Sztucznej Inteligencji (PSZT)

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

Elementy logiki matematycznej

Filozofia z elementami logiki O czym to będzie?

Języki i paradygmaty programowania Wykład 7. dr Dariusz Wardowski, Katedra Analizy Nieliniowej Łódź, 22 maja 2010 r. 1/18

Klasy abstrakcyjne i interfejsy

Celem tego projektu jest stworzenie

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

METODY DOWODZENIA TWIERDZEŃ I AUTOMATYZACJA ROZUMOWAŃ

PRZEWODNIK PO PRZEDMIOCIE

Transkrypt:

Dodatek do rachunku zdań i predykatów Instytut Informatyki, Uniwersytet Śląski, ul. Będzinska 39, Sosnowiec, Polska Tel (32) 2 918 381, Fax (32) 2 918 283 Wykład IVa

Należy do klasy języków deklaratywnych, gdzie opisuje się rozwiązywany problem, a nie tak jak przy językach imperatywnych (proceduralnych) - w których wskazuje się algorytm rozwiązania problemu. Dzięki zautomatyzowaniu procesu dowodzenia twierdzeń logicznych, a szczególnie dzięki opracowaniu przez Robinsona w 1965 roku tzw. zasady rezolucji - stało się możliwe automatyczne wywnioskowania rozwiązania na podstawie zbioru formuł logicznych opisujących problem. Programowanie w prologu składa się z: 1. deklarowania Faktów dotyczących obiektów i związkow między nimi. 2. Definiowania Reguł dotyczyczących obiektów i związków między nimi. 3. Zadawania pytań o obiekty i związki między nimi.

Budowanie baz wiedzy w Prologu Jak wiadomo baza wiedzy to zazwyczaj zbiór złożony z faktów i reguł. Fakty proste Przykładem prostego faktu odzwierciedlającego zdanie: Jest słonecznie. jest predykat zapiany następująco: sunny. W języku Prolog spytamy o prawdziwość tego stwierdzenie następująco:? sunny. A więc używamy przed nazwą predykatu znaków?, które oznaczają pytanie o prawdziwość danego faktu. Oczywiście stwierdzenia (fakty) nie muszą być jedynie funktorami jednoargumentowymi, ale mogą być również wieloargumnetowe. Ogólna składnia predykatu wygląda następująco: relation(< argument1 >, < argument2 >,..., < argumentn >).,gdzie relation oznacza po prostu nazwę funkcji pełnionej przez dany predykat, zaś parametry: < argument1 >, < argument2 >,..., < argumentn >oznaczają kolejne argumenty tej funkcji. I tak, w języku Prolog, stwierdzenie: likes(john, mary). oznacza, że John lubi mary.

Zadawanie pytań i interpretacja odopowiedzi na pytania? Kiedy już wiemy jak zapisywać stwierdzenia (fakty) zawsze możemy pytać o ich prawdziwość. Jeśli przykładowy program wygląda następująco: eats(fred, oranges). /* Fred je pomarańcze */ eats(tony, apple). /* Tony je jabłko */ eats(john, apple). /* John je jabłko */ To jeśli teraz zapytamy:? eats(fred, oranges). /* czy to pasuje do zapisów w bazie wiedzy w Prologu?.*/ Widać, iż tak, więc Prolog odpowie: yes /* yes, ponieważ dokładnie pokrywa się to z 1 zapisem w bazie. */ Podobnie zadając pytanie:? eats(john, apple). Uzyskamy odpowiedź: yes Zaś jeśli spytamy:? eats(mike, apple). prolog odpowie: no /* ponieważ nie ma żadnej relacji między mike i apple, gdyż w naszej bazie nie ma wcale informacji o mike */

Zmienne w Prologu W prologu nie musimy zadawać konretnych pytań. Możemy na przykład zawsze zapytać w naszym przykładowym zbiorze Kto je jabłko? albo Co je Fred? Jeśli więc dla naszego przykładowego programu: eats(fred,oranges).jeśli zapytamy:? eats(fred, what). Prolog odpowie ku naszemu zaskoczeniu: no. Powodem tego jest fakt, że Prolog będzie szukał dopasowania w swojej bazie fred i what. Jeśli natomiast chcieliśmy użyć zmiennej w Prologu, to są one tutaj wyróżnione przez fakt, że zaczynają się zawsze od wielkiej litery.przykładowo: X /* pojedyncza litera */ VaRiAbLe /* wyraz zaczynający się od wielkiej litery */ Two words /* dwa wyrazy oddzielone znakiem podkreślenia */

Zmienne w Prologu cd. Zatem w naszym przypadku, gdy chcieliśmy spytać Co je Fred? powinniśmy użyć np składni:? eats(fred, What) Wówczas Prolog odpowie: What = oranges yes Podobnie możemy spytać: Kto je pomarańcze? zapisująco owo zapytanie tak:? eats(who, oranges). W tym wypadku, Prolog odpowie: Who = fred yes

Zmienne w Prologu cd. Jeśli zaś spytamy:? eats(who, apple). Pierwszą odpowiedzią będzie: [Who = tony] ponieważ jest to pierwsze dopasowanie znalezione w bazie. Teraz Prolog będzie czekał aż wcisnieś jakiś znak. Jeśli wybierzesz znak [enter] Prolog będzie oczekiwał no nowe pytanie. Jeśli zaś użyjesz klawisza [; ], Prolog będzie dalej przeszukiwał swoją bazę w celu znalezienia kolejnych dopasowań (podstawień za zmienną Who). W ten sposób Prolog znajdzie kolejną odpowiedź [Who = john]. Jeśli teraz ponownie wciśniemy znak: [; ] prolog ponownie będzie chciał szukać kolejnych dopasowań. Wynikiem jednak będzie odpowiedź: [no] ponieważ faktycznie w bazie nie ma więcej dopasowań (unifikacji) dla tego stwierdzenia.? eats(who, apple). Who = tony; Who = john; no

Reguły w Prologu Rozważmy zdanie: Wszystki jabłka to owoce. Takie zdanie możemy wyrazić również w Prologu, następująco: fruit(x ) : apple(x ). Zdanie to można odczytać jako: X jest owocem jeśli X jest jabłkiem. Teraz rozważmy zdanie (fakt): Gloster jest typem jabłka. W Prologu zapiszemy to tak: fruit(x ) : apple(x ). apple(gloster). Jeśli teraz spytamy w Prologu:? fruit(gloster).uzyksamy odpowiedź: yes

Reguły w Prologu cd. Prolog użyje zdefiniowanej przez nas reguły, zgodnie z którą X jest owocem, jeśli jest jabłkiem. Zatem dzięki stwierdzeniu: apple(gloster), Prolog wygeneruje nowy fakt: fruit(gloster). W regułach również możemy stosować zmienne. Zatem możemy spytać: Jaki X jest owocem?:? fruit(x ). na co Prolog powinien odpowiedzieć: X = gloster Oczywiście reguły mogą mieć w części przesłankowej (warunkowej) więcej elementów połączonych operatorem logicznym and lub or. Czasami bowiem, do tego samego stwierdzenia możemy dojść różnymi drogami.

Reguły w Prologu cd. Przykładowo, zdanie: Coś jest smaczne jeśli jest owocem i ma słodki smak lub jeśli zawiera cukier. To zdanie można następująco zapisać w Prologu: tasty(x ) : /* coś jest smaczne jeśli */ fruit(x ), /* jest owocem i */ is sweet(x ). /* jest słodkie */ tasty(x ) : /* albo coś jest smaczne jeśli */ has sugar(x ) /* zawiera cukier */ Zatem w takim programie, są 2 drogi, aby dowiedzieć, się czy coś jest smaczne czy nie. Jeśli pierwsza reguła nie pozwoli wykazać prawdziwości tego stwierdzenia, to wówczas Prolog będzie probował wykazać prawdziwość drugiej reguły. Należy pamiętać, iż tak samo nazwane zmienne w regule są traktowane jako ta sama zmienna. Zatem takie same zmienne w różnych regułach są traktowane jako różne zmienne i są w tym względzie niezależne.

Reguły w Prologu cd. Przykładowo w programie: tasty(x ) : fruit(x ), is sweet(x ). tasty(x ) : has sugar(x ). Prolog będzie traktował nasze zapisy jako: tasty(x 1) : fruit(x 1), is sweet(x 1). tasty(x 2) : has sugar(x 2).

Środowisko do programowania w Prolog u Krótkie fakty dotyczące Prolog: Prolog - stworzony w 1971 roku przez Alaina Colmeraurera i Phillipe a Roussela na Uniwersytecie w Marsylii. Podczas pracy nad zastosowaniem logiki predykatow (klauzul Horna) do NLP. Pierwszy kompilator Prologu powstal w Algolu. Od polowy lat 70-tych wspolpraca z Robertem Kowalskim na Uniwersytecie w Edynburgu (Szkocja).

Implementacje - Narzędzia darmowe Ciao Prolog ECLIPSE GNU Prolog SWI-Prolog YAP Prolog

Implementacje - Narzędzia komercyjne ALS Prolog Amzi! Prolog IF Prolog LPA Prolog MINERVA SICStus Prolog

Czym jest GNU Prolog? GNU Prolog (gprolog), to otwarte oprogramowanie pod GNU General Public License. Źródło: [http://gnu-prolog.inria.fr]. Jest to narzędzie w pełni darmowe, autorem jest Daniel Diaz, napisane w języku C. Prócz wbudowanego kompilatora, zawiera także interpreter typu (top-level) i debugger.

Czym jest SWI Prolog? SWI-Prolog to również samodzielne darmowe środowisko do programowania w Prologu. Źródło: [http://www.swi-prolog.org]. Zawiera edytor i program uruchomieniowy. Wraz z narzędziem XPCE pozwala na edycje programów w Prologu nie w notatniku, a właśnie w edytorze XPCE, pozwalającym m.in. na kolorowanie składni programu.

Prolog w praktyce Przykładowa baza: [prolog.pl] Rysunek: Edytor XPCE dla SWI Prolog

Prolog w praktyce Wnioskowanie na bazie [prolog.pl]

Prolog w praktyce Przykład nr 1: wprowadzenie do Prologu Przykład nr 1:Lubi(Jarek, ryby) Lubi(Jarek, Maria) Lubi(Maria, ksiazka) Lubi(Jan, ksiazka) Lubi(Jan, Francja) Teraz gdybyśmy chcieli wywnioskować z tych faktów czy Jarek lubi pieniadze:? lubi(jarek, pieniadze) Odp Prologu: no? lubi(maria, Jarek) Odp Prologu: no? lubi(jarek, Maria) Odp Prologu: yes

Prolog w praktyce Przykład nr 1: wprowadzenie do Prologu Przykład : Lubi(Jan, kwiaty) Lubi(Jan, Maria) Lubi(Pawel, Maria) Teraz gdybyśmy chcieli wywnioskować z tych faktów co lubi Jan? PYTANIE:? lubi(jan, X ) Odp Prologu: X = kwiaty (zmienna X jest odtąd UKONKRETNIONA!) PYTANIE:? lubi(x, Maria) Odp Prologu: X = Jan; X = Pawel; No; co oznacza ze nie ma już więcej odpowiedzi możliwych!

Prolog w praktyce Przykład nr 1: wprowadzenie do Prologu KONIUNKCJE: Przykład : Lubi(Maria, czekolada) Lubi(Maria, wino) Lubi(Jan, wino) Lubi(Jan, Maria) Wówczas: Pytanie:? lubi(jan, Maria), lubi(maria, Jan) Odp Prologu: no; Pytanie:? lubi(maria, X ), lubi(jan, X ) czyli czy istnieje coś co jednocześnie lubią i Maria i Jan Odp Prologu: X = wino; no;

Prolog w praktyce Przykład nr 1: wprowadzenie do Prologu REGUŁY: Jan lubi każdego kto lubi wino Lubi(Jan, X ) : Lubi(X, wino). Jan lubi kobiety, które lubią wino Lubi(Jan, X ) : Kobieta(X ), Lubi(X, wino).

Prolog w praktyce Przykład nr 2: Rozkład lotów 2 predykaty są dane: Rejsy(skąd, dokąd, odlot, przylot) (wyraża dostępne loty między miastami USA) Połączenie(skąd, dokąd, odlot, przylot) (znajduje połączenia pośrednie i bezpośrednie, ale na każdą przesiadkę rezerwuje minimum godzinę między przylotem a odlotem.) Dane są: Rejsy(SF, DEN, 930, 1230) Rejsy(SF, DAL, 900, 1430) Rejsy(DEN, CHI, 1500, 1800) Rejsy(DEN, DAL, 1400, 1700) Rejsy(DAL, CHI, 1530, 1730) Rejsy(CHI, NY, 1500, 1930) Rejsy(CHI, NY, 1900, 2200) Rejsy(CHI, NY, 1830, 2130) Polaczenie(X, Y, O, P) : rejsy(x, Y, O, P) Polaczenie(X, Y, O, P) : rejsy(x, Z, O, T 1), Polaczenie(Z, Y, T 2, P), T 2 >= T 1 + 100.

Prolog w praktyce Przykład nr 2: Rozkład lotów Teraz w celu znalezienia połączeń z San Francisco (SF) do Chicago (CHI) zadajemy następujące pytanie:? Polaczenie(SF, CHI, Odlot, Przylot). A prolog odpowiada: Odlot = 930, Przylot = 1800; Odlot = 900, Przylot = 1730; No. Natomiast jeśli chcemy wylecieć z SF do NY po godzinie 900, to możemy znaleźć odpowiednie połączenie zadając pytanie:? polaczenie(sf, NY, Odlot, Przylot), Odlot > 900. Wówczas Prolog odpowie: Odlot = 930, Przylot = 2200; No.

Prolog w praktyce Przykład nr 3 Windsor

Prolog w praktyce Przykład nr 3 Windsor W Prolog u zapiszemy to następująco: male(james1). male(charles1). male(charles2). male(james2). male(george1). /* female(p) is true when P is female */ female(catherine). female(elizabeth). female(sophia). /* parent(c,p) is true when C has a parent called P*/ parent(charles1, james1). parent(elizabeth, james1). parent(charles2, charles1). parent(catherine, charles1). parent(james2, charles1). parent(sophia, elizabeth). parent(george1, sophia).

Prolog w praktyce Przykład nr 3 Windsor Teraz możliwe jest zdefiniowanie kilku pytań: Was George I the parent of Charles I? parent(charles1, george1). Who was Charles I s parent? parent(charles1, Parent). who were the children of Charles I? parent(child, charles1).

Prolog w praktyce Przykład nr 4 - student Przypuśćmy, że mamy następujące zdania w języku PROLOG: teaches(dr fred, history).. teaches(dr fred, english).. teaches(dr fred, drama). teaches(dr fiona, physics). studies(alice, english). studies(angus, english). studies(amelia, drama). studies(alex, physics). Roważmy następujące pytania i odpowiedzi na nie:? teaches(dr fred, Course), studies(student, Course). odpowiedź: Course = english Student = alice ; Course = english Student = angus ; Course = drama Student = amelia ; No

Prolog w praktyce Przykład nr 5 - Windsor cd. Rozważmy zdania: born(charles, elizabeth2, philip). born(anne, elizabeth2, philip). born(andrew, elizabeth2, philip). born(edward, elizabeth2, philip). born(diana, frances, edwardspencer). born(william, diana, charles). born(henry, diana, charles). Rozważmy więc zapytanie:? born(s, elizabeth2, Y )andborn(g, M, S). Jaka będzie odpowiedź?

Prolog w praktyce - ćwiczenia Przykład nr 6 - Metro w Londynie Schemat metra jest zamieszczony na rysunku.

Prolog w praktyce - ćwiczenia Przykład nr 6 - Metro w Londynie Baza zapisana w Prologu wygląda następująco: connected(bond street, oxford circus, central). connected(oxford circus, tottenham court road, central). connected(bond street, green park, jubilee). connected(green park, charing cross, jubilee). connected(green park, piccadilly circus, piccadilly). connected(piccadilly circus, leicester square, piccadilly). connected(green park, oxford circus, victoria). connected(oxford circus, piccadilly circus, bakerloo). connected(piccadilly circus, charing cross, bakerloo). connected(tottenham court road, leicester square, northern). connected(leicester square, charing cross, northern). nearby(bond street, oxford circus). nearby(oxford circus, tottenham court road). nearby(bond street, tottenham court road). nearby(bond street, green park). nearby(green park, charing cross). nearby(bond street, charing cross). nearby(green park, piccadilly circus). nearby(piccadilly circus, leicester square).

Prolog w praktyce - ćwiczenia Przykład nr 6 - Metro w Londynie cd. bazy... nearby(green park, leicester square). nearby(green park, oxford circus). nearby(oxford circus, piccadilly circus). nearby(piccadilly circus, charing cross). nearby(oxford circus, charing cross). nearby(tottenham court road, leicester square). nearby(leicester square, charing cross). nearby(tottenham court road, charing cross).

Prolog w praktyce - ćwiczenia Przykład nr 6 - Metro w Londynie Wykonaj teraz zapytania:? nearby(tottenham court road, W ) oraz? connected(tottenham court road, W, L). Czy zapisy: nearby(x, Y ) : connected(x, Y, L). nearby(x, Y ) : connected(x, Z, L), connected(z, Y, L). dokładnie odpowiadają zawartości całej bazy?

Literatura Pawlak Z., (1983) Information Systems - theoretical foundations [polish], WNT, W-wa. Pogorzelski W.A., (1973), Klasyczny rachunek zdan. Zarys teorii, PWN, Warszawa, Poland Cholewa W., Pedrycz W., (1987), Systemy doradcze, skrypt Politechniki Śląskiej nr 1447, Gliwice, Poland Cichosz P.,(2001), Systemy uczące się, WNT,Warszawa, Poland Grzegorczyk A., (1969), Zarys logiki matematycznej, PWN, Warszawa, Poland Paprzycka K., Samouczek logiki zdań i logiki kwantyfikatorów - dostępny na stronie: http: //www.filozofia.uw.edu.pl/kpaprzycka/publ/xsamouczek.html Nilsson U., Małuszyński J.,(2000), Logic, programming and Prolog (2ED), http://www.ida.liu.se/~ulfni/lpp Flach P., (1994), University of Bristol, United KingdomSimply Logical - Intelligent Reasoning by Example