Liczby, zbiory i listy

Liczby są prawdopodobnie najbardziej żywym przykładem tego, jak wielką teorię można zbudować z malutkiego jądra aksjomatów. Opisujemy tutaj teorię liczb naturalnych lub nieujemnych liczb całkowitych. Potrzebujemy predykatu NatNum, który będzie prawdziwy dla liczb naturalnych; potrzebujemy jednego stałego symbolu, 0; i potrzebujemy jednego symbolu funkcji, S (następca). Aksjomaty Peano definiują liczby naturalne i dodawanie. Liczby naturalne są definiowane rekurencyjnie:

Oznacza to, że 0 jest liczbą naturalną, a dla każdego obiektu  n , jeśli n jest liczbą naturalną, to S(n) jest liczbą naturalną. Więc liczby naturalne to 0, S(0), S(S(0)) , i tak dalej. Potrzebujemy również aksjomatów, aby ograniczyć funkcję następnika:

Teraz możemy zdefiniować dodawanie w terminach funkcji następnika

Pierwszy z tych aksjomatów mówi, że dodanie 0 do dowolnej liczby naturalnej m daje samo m. Zwróć uwagę na użycie symbolu funkcji binarnej „+” w terminie +(m,0) ; w zwykłej matematyce termin zostałby napisany m+0 przy użyciu notacji wrostkowej. (Notacja, której użyliśmy dla logiki pierwszego rzędu, nazywa się prefiksem). Aby ułatwić czytanie naszych zdań o liczbach, zezwalamy na użycie notacji infiksowej. Możemy również zapisać S(n) jako n+1 , więc drugi aksjomat staje się

Aksjomat ten ogranicza dodawanie do wielokrotnego stosowania funkcji następcy. Użycie notacji infiksowej jest przykładem cukru składniowego, czyli rozszerzenia lub skrótu standardowej składni, który nie zmienia semantyki. Każde zdanie, w którym używa się cukru, może zostać „odcukrzone”, aby stworzyć równoważne zdanie w zwykłej logice pierwszego rzędu. Innym przykładem jest użycie nawiasów kwadratowych zamiast nawiasów, aby łatwiej było zobaczyć, który nawias lewy pasuje do nawiasu prawego. Jeszcze innym przykładem jest zwijanie się kwantyfikatorów: zastąpienie     przez

Kiedy już mamy dodawanie, łatwo jest zdefiniować mnożenie jako wielokrotne dodawanie, potęgowanie jako wielokrotne mnożenie, dzielenie liczb całkowitych i reszty, liczby pierwsze i tak dalej. Tak więc całą teorię liczb (w tym kryptografię) można zbudować z jednej stałej, jednej funkcji, jednego predykatu i czterech aksjomatów.

Dziedzina zbiorów ma również fundamentalne znaczenie dla matematyki, a także dla zdroworozsądkowego rozumowania. (W rzeczywistości możliwe jest zdefiniowanie teorii liczb w terminach teorii mnogości.) Chcemy móc reprezentować poszczególne zbiory, w tym zbiór pusty. Potrzebujemy sposobu na budowanie zbiorów z elementów lub operacji na innych zbiorach. Będziemy chcieli wiedzieć, czy element jest członkiem zbioru i będziemy chcieli odróżnić zbiory od obiektów, które nie są zbiorami.

Użyjemy normalnego słownictwa teorii mnogości jako cukru składniowego. Pusty zbiór to stała zapisana jako {} . Istnieje jeden orzecznik jednoargumentowy, Set, który jest prawdziwy dla zbiorów. Predykaty binarne to x  ( jest x członkiem set s ) i s1  s2(zbiór s1 jest podzbiorem s2, prawdopodobnie równym s2 ). Funkcje binarne to s1  s2(przecięcie), s1  s2 (union) i Add(x,s)(zbiór wynikający z dodania elementu x do zbioru s ). Jeden z możliwych zestawów aksjomatów jest następujący:

  1. Jedyne zestawy to zestaw pusty oraz te wykonane przez dodanie czegoś do zestawu:

∀s Set(s) ⇔ (s ={}) ∨ (∃x, s2  Set(s2) ∧ s = Add(x, s2))

  1. Pusty zestaw nie zawiera żadnych dodanych elementów. Innymi słowy, nie ma sposobu, aby rozłożyć {} na mniejszy zestaw i element:

¬∃ x,s Add(x,s) = { }

  1. Dodanie elementu już w zestawie nie ma żadnego efektu:

∀x,s x ∈ s ⇔ s = Add(x,s)

  1. Jedynymi elementami zestawu są elementy, które zostały do ​​niego dodane. Wyrażamy to rekurencyjnie, mówiąc, że jest członkiem wtedy i tylko wtedy, gdy jest równy pewnemu elementowi dodanemu do pewnego zbioru , gdzie albo jest taki sam jak albo jest członkiem :

∀x,s x ∈ s ⇔ ∃ y,s2 (s = Add(y,s2) ∧ (x = y ∨ x ∈ s2))

  1. Zbiór jest podzbiorem innego zbioru wtedy i tylko wtedy, gdy wszyscy członkowie pierwszego zbioru są członkami drugiego zbioru:

∀s1,s2 s1 ⊆ s2 ⇔ (∀x x ∈ s1 ⇒ x ∈ s2)

  1. Dwa zbiory są równe wtedy i tylko wtedy, gdy każdy jest podzbiorem drugiego:

∀s1,s2 (s1 = s2) ⇔ (s1 ⊆ s2 ∧ s2 ⊆ s1)

  1. Obiekt znajduje się na przecięciu dwóch zbiorów wtedy i tylko wtedy, gdy jest członkiem obu zbiorów:

∀x,s1,s2 x ∈ (s1 ∩ s2) ⇔ (x ∈ s1 ∧ x ∈ s2)

  1. Obiekt jest połączeniem dwóch zestawów wtedy i tylko wtedy, gdy jest członkiem jednego z zestawów:

∀x,s1,s2 x ∈ (s1 ∪ s2) ⇔ (x ∈ s1 ∨ x ∈ s2)

Listy są podobne do zestawów. Różnice polegają na tym, że listy są uporządkowane i ten sam element może pojawić się więcej niż raz na liście. Możemy użyć słownika Lispu dla list: Nil jest stałą listą bez elementów; Wady, Dołącz, Pierwszy i Reszta są funkcjami; a Find jest predykatem, który robi dla list to, co Member robi dla zbiorów. Lista jest predykatem, który jest prawdziwy tylko dla list. Podobnie jak w przypadku zestawów, często używa się cukru składniowego w zdaniach logicznych zawierających listy. Pusta lista to [ ]. Termin Cons(x,Nil) (tj. lista zawierająca element x, po którym następuje nic) jest zapisywany jako [x]. Lista kilku elementów, takich jak [A,B,C], odpowiada zagnieżdżonemu terminowi Cons(A,Cons(B,Cons(C,Nil)))

Domena pokrewieństwa

Pierwszym rozważanym przez nas przykładem jest dziedzina relacji rodzinnych lub pokrewieństwa. Ta domena obejmuje fakty, takie jak „Elizabeth jest matką Karola” i „Karol jest ojcem Williama” i zasady, takie jak „Babcia jest matką rodzica”. Oczywiście obiektami w naszej domenie są ludzie. Predykaty jednoargumentowe obejmują między innymi Male i Female. Relacje pokrewieństwa — rodzicielstwo, braterstwo, małżeństwo itd. — są reprezentowane przez predykaty binarne: rodzic, rodzeństwo, brat, siostra, dziecko, córka, syn, małżonek, żona, mąż, dziadek, wnuk, kuzyn, ciocia i wujek. Używamy funkcji Matki i Ojca, ponieważ każda osoba ma dokładnie jedną z nich, biologicznie (chociaż moglibyśmy wprowadzić dodatkowe funkcje dla matek adopcyjnych, matek zastępczych itp.). Możemy przejść przez każdą funkcję i orzeczenie, zapisując to, co wiemy, za pomocą innych symboli. Na przykład, czyjaś matka jest rodzicem, który jest kobietą:

Mąż to współmałżonek:

Rodzic i dziecko to odwrotne relacje:

Dziadek to rodzic swojego rodzica:

Rodzeństwo to kolejne dziecko swojego rodzica:

Każde z tych zdań można traktować jako aksjomat domeny pokrewieństwa. Aksjomaty są powszechnie kojarzone z dziedzinami czysto matematycznymi — wkrótce zobaczymy niektóre aksjomaty liczb — ale są one potrzebne we wszystkich dziedzinach. Dostarczają podstawowych informacji faktycznych, z których można wyciągnąć użyteczne wnioski. Nasze aksjomaty pokrewieństwa są również definicjami; mają formę  Aksjomaty definiują funkcję Matki i funkcję oraz predykaty Mąż, Mężczyzna, Rodzic, Dziadkowie i Rodzeństwo w kategoriach innych predykatów. Nasze definicje są „oddolne” w podstawowym zestawie predykatów (Dziecko, Kobieta itp.), w których ostatecznie definiuje się pozostałe.

Jest to naturalny sposób budowania reprezentacji domeny i jest analogiczny do sposobu budowania pakietów oprogramowania przez kolejne definicje podprogramów z pierwotnych funkcji bibliotecznych. Zauważ, że niekoniecznie istnieje unikalny zestaw predykatów pierwotnych; równie dobrze moglibyśmy użyć Rodzica zamiast Dziecka. W niektórych dziedzinach, jak pokazujemy, nie ma jednoznacznie identyfikowalnego zestawu podstawowego. Nie wszystkie logiczne zdania dotyczące domeny są aksjomatami. Niektóre są twierdzeniami – to znaczy wynikają z aksjomatów. Rozważmy na przykład twierdzenie, że rodzeństwo jest symetryczne:

Czy to aksjomat czy twierdzenie? W rzeczywistości jest to twierdzenie, które logicznie wynika z aksjomatu definiującego rodzeństwo. Jeśli Pytamy bazę wiedzy o to zdanie, powinno ono zwrócić prawdę. Z czysto logicznego punktu widzenia baza wiedzy musi zawierać tylko aksjomaty, a nie twierdzenia, ponieważ twierdzenia nie powiększają zbioru wniosków wynikających z bazy wiedzy. Z praktycznego punktu widzenia twierdzenia są niezbędne do obniżenia kosztów obliczeniowych wyprowadzania nowych zdań. Bez nich system rozumowania musi za każdym razem zaczynać się od pierwszych zasad, podobnie jak fizyk musi na nowo wyprowadzać reguły rachunku różniczkowego dla każdego nowego problemu. Nie wszystkie aksjomaty są definicjami. Niektóre dostarczają bardziej ogólnych informacji o pewnych predykatach bez tworzenia definicji. Rzeczywiście, niektóre predykaty nie mają pełnej definicji, ponieważ nie wiemy wystarczająco dużo, aby je w pełni scharakteryzować. Na przykład nie ma oczywistego, ostatecznego sposobu na dokończenie zdania

Na szczęście logika pierwszego rzędu pozwala nam korzystać z predykatu Person bez całkowitego jego definiowania. Zamiast tego możemy napisać częściowe specyfikacje właściwości, które ma każda osoba, oraz właściwości, które czynią coś osobą:

Aksjomaty mogą być również „po prostu zwykłymi faktami”, takimi jak Mężczyzna(Jim) i Małżonka(Jim,Laura). Takie fakty tworzą opisy konkretnych przypadków problemowych, umożliwiając udzielenie odpowiedzi na konkretne pytania. Jeśli wszystko pójdzie dobrze, odpowiedziami na te pytania będą twierdzenia wynikające z aksjomatów. Często okazuje się, że oczekiwane odpowiedzi nie nadchodzą – na przykład od Małżonki (Jim, Laura) oczekuje się (zgodnie z prawem wielu krajów), że będzie w stanie to wywnioskować ¬Spouse(George, Laura); ale nie wynika to z podanych wcześniej aksjomatów – nawet po dodaniu Jim ≠ George. To znak, że brakuje aksjomatu.

Asercje i zapytania w logice pierwszego rzędu

Zdania są dodawane do bazy wiedzy za pomocą TELL, dokładnie tak jak w logice zdań. Takie zdania nazywamy twierdzeniami. Na przykład możemy stwierdzić, że Jan jest królem, Ryszard osobą, a wszyscy królowie są osobami:

Za pomocą ASK możemy zadawać pytania z bazy wiedzy. Na przykład,

Ask(K,B,King(John))

zwraca prawdę. Pytania zadawane za pomocą ASK nazywane są zapytaniami lub celami. Ogólnie rzecz biorąc, na każde pytanie, które logicznie wynika z bazy wiedzy, należy odpowiedzieć twierdząco. Na przykład, biorąc pod uwagę trzy powyższe stwierdzenia, zapytanie

Ask(K,B,Person(John))

powinien również zwracać true. Możemy zadawać kwantyfikowalne zapytania, takie jak

Odpowiedź jest prawdziwa, ale może nie jest to tak pomocne, jak byśmy chcieli. To trochę jak odpowiedź „Czy możesz mi podać godzinę?” z „Tak”. Jeśli chcemy wiedzieć, jaka wartość x sprawia, że zdanie jest prawdziwe, potrzebujemy innej funkcji, którą nazywamy ASKVARS,

i która daje strumień odpowiedzi. W tym przypadku będą dwie odpowiedzi: {x/John} i {x/Richard}. Taka odpowiedź nazywana jest listą substytucyjną lub wiążącą. ASKVARS jest zwykle zarezerwowany dla baz wiedzy składających się wyłącznie z klauzul Horn, ponieważ w takich bazach wiedzy każdy sposób urzeczywistnienia zapytania wiąże zmienne z określonymi wartościami. Tak nie jest w przypadku logiki pierwszego rzędu; w KB, któremu powiedziano tylko, że King(John) V King (Richard) nie ma jednego powiązania, które sprawia, że zapytanie jest prawdziwe ∃x King(x), nawet jeśli zapytanie jest w rzeczywistości prawdziwe.

Domena obwodów elektronicznych

Opracujemy ontologię i bazę wiedzy, które pozwolą nam wnioskować o obwodach cyfrowych w rodzaju pokazanych na rysunku .Śledzimy siedmioetapowy proces inżynierii wiedzy.

Zidentyfikuj pytania

Istnieje wiele zadań rozumowania związanych z obwodami cyfrowymi. Na najwyższym poziomie analizuje się funkcjonalność obwodu. Na przykład, czy obwód na rysunku 8.6 faktycznie dodaje się poprawnie? Jeśli wszystkie wejścia są wysokie, jakie jest wyjście bramki A2?

Istnieje wiele zadań rozumowania związanych z obwodami cyfrowymi. Na najwyższym poziomie analizuje się funkcjonalność obwodu. Na przykład, czy obwód na rysunku 8.6 faktycznie dodaje się poprawnie? Jeśli wszystkie wejścia są wysokie, jakie jest wyjście bramki A2? Interesujące są również pytania dotyczące struktury obwodu. Na przykład, jakie są wszystkie bramki podłączone do pierwszego zacisku wejściowego? Czy obwód zawiera pętle sprzężenia zwrotnego? To będą nasze zadania w tej sekcji. Istnieją bardziej szczegółowe poziomy analizy, w tym te związane z opóźnieniami czasowymi, obszarem obwodu, zużyciem energii, kosztami produkcji i tak dalej. Każdy z tych poziomów wymagałby dodatkowej wiedzy.

Zbierz odpowiednią wiedzę

Co wiemy o układach cyfrowych? Na nasze potrzeby składają się z drutów i bramek. Sygnały przepływają przewodami do zacisków wejściowych bramek, a każda bramka wytwarza sygnał na zacisku wyjściowym, który przepływa wzdłuż innego przewodu. Aby określić, jakie będą te sygnały, musimy wiedzieć, w jaki sposób bramki przekształcają swoje sygnały wejściowe. Istnieją cztery typy bramek: bramki AND, OR i XOR mają dwa zaciski wejściowe, a bramki NOT mają jeden. Wszystkie bramki mają jeden zacisk wyjściowy. Obwody, podobnie jak bramki, mają zaciski wejściowe i wyjściowe. Aby uzasadnić funkcjonalność i łączność, nie musimy mówić o samych przewodach, ścieżkach, którymi podążają, ani połączeniach, w których się łączą. Liczą się tylko połączenia między terminalami – możemy powiedzieć, że jeden terminal wyjściowy jest połączony z innym terminalem wejściowym, bez konieczności mówienia, co faktycznie je łączy. Inne czynniki, takie jak rozmiar, kształt, kolor lub koszt różnych komponentów, są dla nas nieistotne analizy. Gdyby naszym celem było coś innego niż weryfikacja projektów na poziomie bramek, ontologia byłaby inna. Na przykład, gdybyśmy byli zainteresowani debugowaniem uszkodzonych obwodów, prawdopodobnie dobrym pomysłem byłoby włączenie przewodów do ontologii, ponieważ wadliwy przewód może zaburzyć przepływający przez niego sygnał. Aby rozwiązać błędy czasowe, musielibyśmy uwzględnić opóźnienia bramek. Gdybyśmy byli zainteresowani zaprojektowaniem produktu, który byłby rentowny, wówczas istotny byłby koszt obwodu i jego szybkość w stosunku do innych produktów na rynku.

Proces inżynierii wiedzy

Projekty inżynierii wiedzy różnią się znacznie pod względem treści, zakresu i trudności, ale wszystkie takie projekty obejmują następujące etapy:

  1. OKREŚL PYTANIA. Inżynier wiedzy musi określić zakres pytań, które baza wiedzy będzie wspierać, oraz rodzaje faktów, które będą dostępne dla każdej konkretnej instancji problemu. Na przykład, czy wumpusowa baza wiedzy musi mieć możliwość wyboru działań, czy wystarczy odpowiedzieć na pytania dotyczące zawartości środowiska? Czy fakty dotyczące czujnika będą zawierać aktualną lokalizację? Zadanie określi, jaka wiedza musi być reprezentowana, aby połączyć instancje problemów z odpowiedziami. Ten krok jest analogiczny do procesu PEAS dotyczącego projektowania agentów w rozdziale 2 .
  2. ZBIERZ ODPOWIEDNIĄ WIEDZĘ. Inżynier wiedzy może już być ekspertem w danej dziedzinie lub może potrzebować współpracy z prawdziwymi ekspertami, aby wydobyć to, co wiedzą – w procesie zwanym pozyskiwaniem wiedzy. Na tym etapie wiedza nie jest reprezentowana formalnie. Chodzi o to, aby zrozumieć zakres bazy wiedzy określony przez zadanie oraz zrozumieć, jak faktycznie działa domena. W świecie wumpusa, który jest zdefiniowany przez sztuczny zestaw reguł, odpowiednia wiedza jest łatwa do zidentyfikowania. (Zauważ jednak, że definicja sąsiedztwa nie została wyraźnie podana w regułach świata Wumpus). weź pod uwagę rozproszenie pojemności i efekty skórne.
  3. ZAJMIJ SIĘ SŁOWNIKIEM PREDYKATÓW, FUNKCJI I STAŁE. Oznacza to, że przetłumacz ważne koncepcje na poziomie domeny na nazwy poziomów logicznych. Wiąże się to z wieloma pytaniami dotyczącymi stylu inżynierii wiedzy. Podobnie jak styl programowania, może to mieć znaczący wpływ na ostateczny sukces projektu. Na przykład, czy zagłębienia powinny być reprezentowane przez obiekty, czy przez jednoargumentowy orzeczenie na kwadratach? Czy orientacja agenta powinna być funkcją czy predykatem? Czy lokalizacja wumpusa powinna zależeć od czasu? Po dokonaniu wyborów wynikiem jest słownictwo znane jako ontologia domeny. Słowo ontologia oznacza określoną teorię natury bytu lub istnienia. Ontologia określa, jakie rodzaje rzeczy istnieją, ale nie określa ich specyficznych właściwości i wzajemnych relacji.
  4. ZAKODUJ OGÓLNĄ WIEDZĘ O DOMENIE. Inżynier wiedzy zapisuje aksjomaty dla wszystkich terminów słownikowych. To ustala (w miarę możliwości) znaczenie terminów, umożliwiając ekspertowi sprawdzenie treści. Często ten krok ujawnia nieporozumienia lub luki w słownictwie, które muszą naprawić, wracając do kroku 3 i powtarzając proces.
  5. ZAKODUJ OPIS WYSTĄPIENIA PROBLEMU. Jeśli ontologia jest dobrze przemyślana, ten krok jest łatwy. Polega na pisaniu prostych zdań atomowych o wystąpieniach pojęć, które są już częścią ontologii. W przypadku agenta logicznego instancje problemu są dostarczane przez czujniki, podczas gdy „odcieleśniona” baza wiedzy otrzymuje zdania w taki sam sposób, jak tradycyjne programy otrzymują dane wejściowe.
  6. ZADAWAJ ZAPYTANIA DO PROCEDURY WNIOSKOWANIA I UZYSKAJ ODPOWIEDZI. Tutaj jest nagroda: możemy pozwolić, aby procedura wnioskowania działała na aksjomatach i faktach specyficznych dla problemu, aby wyprowadzić fakty, które chcemy poznać. W ten sposób unikamy konieczności pisania algorytmu rozwiązania specyficznego dla aplikacji.
  7. DEBUGUJ I OCENA BAZY WIEDZY. Niestety, odpowiedzi na pytania rzadko będą poprawne za pierwszym razem. Dokładniej, odpowiedzi będą poprawne dla bazy wiedzy w formie, w jakiej została napisana, zakładając, że procedura wnioskowania jest prawidłowa, ale nie będą tymi, których oczekuje użytkownik. Na przykład, jeśli brakuje aksjomatu, na niektóre zapytania nie będzie można odpowiedzieć z bazy wiedzy. Może dojść do znacznego procesu debugowania. Brakujące aksjomaty lub aksjomaty, które są zbyt słabe, można łatwo zidentyfikować, zauważając miejsca, w których łańcuch rozumowania niespodziewanie się zatrzymuje. Na przykład, jeśli baza wiedzy zawiera regułę diagnostyczną.

zamiast dwuwarunkowego, agent nigdy nie będzie w stanie udowodnić braku wumpuses. Błędne aksjomaty można zidentyfikować, ponieważ są to fałszywe stwierdzenia dotyczące świata. Na przykład zdanie

jest fałszywe dla gadów, płazów i stołów. Fałszywość tego zdania można ustalić niezależnie od reszty bazy wiedzy. Natomiast typowy błąd w programie wygląda tak:

offset = position + 1

Bez zrozumienia otaczającego kontekstu nie można powiedzieć, czy przesunięcie powinno być pozycją, czy pozycją +1.

Kiedy dojdziesz do punktu, w którym nie ma oczywistych błędów w Twojej bazie wiedzy, kuszące jest ogłosić sukces. Ale o ile oczywiście nie ma błędów, lepiej formalnie ocenić swój system, uruchamiając go na zestawie testowym zapytań i mierząc, ile masz rację. Bez obiektywnego pomiaru zbyt łatwo jest przekonać samego siebie, że praca jest wykonana. Aby lepiej zrozumieć ten siedmioetapowy proces, zastosujemy go teraz do rozszerzonego przykładu – dziedziny obwodów elektronicznych.

Inżynieria wiedzy w logice pierwszego rzędu

Poprzednia sekcja ilustrowała użycie logiki pierwszego rzędu do reprezentacji wiedzy w trzech prostych dziedzinach. W tej sekcji opisano ogólny proces budowy bazy wiedzy — proces zwany inżynierią wiedzy. Inżynier wiedzy to ktoś, kto bada konkretną dziedzinę, uczy się, jakie koncepcje są w niej ważne i tworzy formalną reprezentację obiektów i relacji w tej domenie. Ilustrujemy proces inżynierii wiedzy w domenie obwodów elektronicznych. Przyjęte przez nas podejście jest odpowiednie do tworzenia specjalistycznych baz wiedzy, których dziedzina jest dokładnie określona i których zakres zapytań jest z góry znany. Bazy wiedzy ogólnego przeznaczenia, które obejmują szeroki zakres ludzkiej wiedzy i są przeznaczone do wspierania takich zadań, jak rozumienie języka naturalnego

Świat Wumpusa

Niektóre aksjomaty logiki zdań dla świata wumpus zostały podane w rozdziale 7 . Aksjomaty pierwszego rzędu w tej sekcji są znacznie bardziej zwięzłe, oddające w naturalny sposób dokładnie to, co chcemy powiedzieć. Przypomnij sobie, że agent wumpus otrzymuje wektor percepcji z pięcioma elementami. Odpowiednie zdanie pierwszego rzędu przechowywane w bazie wiedzy musi zawierać zarówno percept, jak i czas, w którym nastąpiło; w przeciwnym razie agent będzie zdezorientowany, kiedy zobaczy co. W krokach czasowych używamy liczb całkowitych. Typowym zdaniem percepcyjnym byłoby:

Tutaj Percept jest predykatem binarnym, a Stench i tak dalej są stałymi umieszczonymi na liście. Działania w świecie wumpus można przedstawić za pomocą terminów logicznych:

Aby określić, który z nich jest najlepszy, program agenta wykonuje zapytanie

który zwraca listę powiązań, taką jak . Program agenta może następnie powrócić jako działanie do wykonania. Surowe dane percepcyjne implikują pewne fakty dotyczące obecnego stanu. Na przykład:

i tak dalej. Reguły te przejawiają trywialną formę procesu rozumowania zwanego percepcją, którą szczegółowo przeanalizujemy w rozdziale 25 . Zwróć uwagę na kwantyfikację w czasie. W logice zdaniowej potrzebowalibyśmy kopii każdego zdania dla każdego kroku czasowego. Proste zachowanie „odruchowe” można również zaimplementować za pomocą skwantyfikowanych zdań implikacyjnych. Na przykład mamy

Biorąc pod uwagę poglądy i zasady z poprzednich akapitów, doprowadziłoby to do pożądanego wniosku BestAction(Grab,5)- jest to słuszne posunięcie. Przedstawiliśmy wejścia i wyjścia agenta; teraz nadszedł czas na reprezentowanie samego środowiska. Zacznijmy od przedmiotów. Oczywistymi kandydatami są kwadraty, doły i wumpus. Moglibyśmy nazwać każdy kwadrat – Square1,2 i tak dalej — ale wtedy fakt, że  Square1,2 i Square1,3 są sąsiadujące, musiałby być faktem „dodatkowym” i potrzebowalibyśmy jednego takiego faktu dla każdej pary kwadratów. Lepiej jest użyć złożonego terminu, w którym wiersz i kolumna występują jako liczby całkowite; na przykład możemy po prostu użyć terminu listy [1,2]. Sąsiedztwo dowolnych dwóch kwadratów można zdefiniować jako

Moglibyśmy nazwać każdy dół, ale byłoby to niewłaściwe z innego powodu: nie ma powodu, aby rozróżniać doły. Łatwiej jest użyć jednoargumentowego predykatu Pit, który jest prawdziwy dla kwadratów zawierających wgłębienia. Wreszcie, ponieważ istnieje dokładnie jeden wumpus, stały Wumpus jest tak samo dobry jak orzeczenie jednoargumentowe (i być może bardziej dostojne z punktu widzenia wumpusa). Lokalizacja agenta zmienia się w czasie, dlatego piszemy At(Agent,s,t) w celu oznaczenia, że agent jest w punkcie kwadratowym s w czasie t . Możemy na zawsze naprawić wumpusa w określonej lokalizacji za pomocą  Możemy wtedy powiedzieć, że obiekty mogą znajdować się tylko w jednym miejscu na raz:

Biorąc pod uwagę jego aktualną lokalizację, agent może wywnioskować własności kwadratu z własności jego aktualnej percepcji. Na przykład, jeśli agent znajduje się na kwadracie i widzi powiew, to ten kwadrat jest przewiewny:

Warto wiedzieć, że kwadrat jest przewiewny, ponieważ wiemy, że doły nie mogą się poruszać. Zauważ, że Breezy nie ma argumentu dotyczącego czasu. Po odkryciu, które miejsca są przewiewne (lub śmierdzące) i, co bardzo ważne, nie przewiewne (lub nie śmierdzące), agent może wydedukować, gdzie są doły (i gdzie jest wumpus). Podczas gdy logika zdań wymaga oddzielnego aksjomatu dla każdego kwadratu i wymagałaby innego zestawu aksjomatów dla każdego geograficznego układu świata, logika pierwszego rzędu potrzebuje tylko jednego aksjomatu:

Podobnie w logice pierwszego rzędu możemy określić ilościowo w czasie, więc potrzebujemy tylko jednego aksjomatu stanu następcy dla każdego predykatu, a nie innej kopii dla każdego kroku czasowego.

Z tych dwóch przykładowych zdań widać, że sformułowanie logiki w rozdziale 7 . Czytelnik proszony jest o skonstruowanie analogicznych aksjomatów dla lokalizacji i orientacji agenta; w tych przypadkach aksjomaty dotyczą zarówno przestrzeni, jak i czasu. Podobnie jak w przypadku estymacji stanów zdań, agent może użyć logicznego wnioskowania z tego rodzaju aksjomatami, aby śledzić aspekty świata, które nie są bezpośrednio obserwowane.

Liczby, zbiory i listy

Liczby są prawdopodobnie najbardziej żywym przykładem tego, jak wielką teorię można zbudować z malutkiego jądra aksjomatów. Opisujemy tutaj teorię liczb naturalnych lub nieujemnych liczb całkowitych. Potrzebujemy predykatu NatNum, który będzie prawdziwy dla liczb naturalnych; potrzebujemy jednego stałego symbolu, 0; i potrzebujemy jednego symbolu funkcji, S (następca). Aksjomaty Peano definiują liczby naturalne i dodawanie. Liczby naturalne są definiowane rekurencyjnie:

Oznacza to, że 0 jest liczbą naturalną, a dla każdego obiektu  n , jeśli n jest liczbą naturalną, to S(n) jest liczbą naturalną. Więc liczby naturalne to 0, S(0), S(S(0)) , i tak dalej. Potrzebujemy również aksjomatów, aby ograniczyć funkcję następnika:

Teraz możemy zdefiniować dodawanie w terminach funkcji następnika

Pierwszy z tych aksjomatów mówi, że dodanie 0 do dowolnej liczby naturalnej m daje samo m. Zwróć uwagę na użycie symbolu funkcji binarnej „+” w terminie +(m,0) ; w zwykłej matematyce termin zostałby napisany m+0 przy użyciu notacji wrostkowej. (Notacja, której użyliśmy dla logiki pierwszego rzędu, nazywa się prefiksem). Aby ułatwić czytanie naszych zdań o liczbach, zezwalamy na użycie notacji infiksowej. Możemy również zapisać S(n) jako n+1 , więc drugi aksjomat staje się

Aksjomat ten ogranicza dodawanie do wielokrotnego stosowania funkcji następcy. Użycie notacji infiksowej jest przykładem cukru składniowego, czyli rozszerzenia lub skrótu standardowej składni, który nie zmienia semantyki. Każde zdanie, w którym używa się cukru, może zostać „odcukrzone”, aby stworzyć równoważne zdanie w zwykłej logice pierwszego rzędu. Innym przykładem jest użycie nawiasów kwadratowych zamiast nawiasów, aby łatwiej było zobaczyć, który nawias lewy pasuje do nawiasu prawego. Jeszcze innym przykładem jest zwijanie się kwantyfikatorów: zastąpienie

przez

Kiedy już mamy dodawanie, łatwo jest zdefiniować mnożenie jako wielokrotne dodawanie, potęgowanie jako wielokrotne mnożenie, dzielenie liczb całkowitych i reszty, liczby pierwsze i tak dalej. Tak więc całą teorię liczb (w tym kryptografię) można zbudować z jednej stałej, jednej funkcji, jednego predykatu i czterech aksjomatów.

Dziedzina zbiorów ma również fundamentalne znaczenie dla matematyki, a także dla zdroworozsądkowego rozumowania. (W rzeczywistości możliwe jest zdefiniowanie teorii liczb w terminach teorii mnogości.) Chcemy móc reprezentować poszczególne zbiory, w tym zbiór pusty. Potrzebujemy sposobu na budowanie zbiorów z elementów lub operacji na innych zbiorach. Będziemy chcieli wiedzieć, czy element jest członkiem zbioru i będziemy chcieli odróżnić zbiory od obiektów, które nie są zbiorami.

Użyjemy normalnego słownictwa teorii mnogości jako cukru składniowego. Pusty zbiór to stała zapisana jako {} . Istnieje jeden orzecznik jednoargumentowy, Set, który jest prawdziwy dla zbiorów. Predykaty binarne to x ∈ s ( jest x członkiem zbioru  s ) i s1 ⊆  s2(zbiór s1 jest podzbiorem s2, prawdopodobnie równym s2 ). Funkcje binarne to s1 ∩  s2(przecięcie), s1 ∪  s2 (union) i Add(x,s)(zbiór wynikający z dodania elementu x do zbioru s ). Jeden z możliwych zestawów aksjomatów jest następujący:

  1. Jedyne zestawy to zestaw pusty oraz te wykonane przez dodanie czegoś do zestawu:

2. Pusty zbiór nie zawiera żadnych dodanych elementów. Innymi słowy, nie ma sposobu, aby rozłożyć {} na mniejszy zbiór i element:

3. Dodanie elementu już w zbiorze nie ma żadnego efektu:

4. Jedynymi elementami zbioru są elementy, które zostały do ​​niego dodane. Wyrażamy to rekurencyjnie, mówiąc, że jest członkiem wtedy i tylko wtedy, gdy jest równy pewnemu elementowi dodanemu do pewnego zbioru , gdzie albo jest taki sam jak albo jest członkiem :

5. Zbiór jest podzbiorem innego zbioru wtedy i tylko wtedy, gdy wszyscy członkowie pierwszego zbioru są członkami drugiego zbioru:

 

6. Dwa zbiory są równe wtedy i tylko wtedy, gdy każdy jest podzbiorem drugiego:

7. Obiekt znajduje się na przecięciu dwóch zbiorów wtedy i tylko wtedy, gdy jest członkiem obu zbiorów:

8. Obiekt jest połączeniem dwóch zestawów wtedy i tylko wtedy, gdy jest członkiem jednego z zestawów:

Listy są podobne do zestawów. Różnice polegają na tym, że listy są uporządkowane i ten sam element może pojawić się więcej niż raz na liście. Możemy użyć słownika Lispu dla list: Nil jest stałą listą bez elementów; Wady, Dołącz, Pierwszy i Reszta są funkcjami; a Find jest predykatem, który robi dla list to, co Member robi dla zbiorów. Lista jest predykatem, który jest prawdziwy tylko dla list. Podobnie jak w przypadku zestawów, często używa się cukru składniowego w zdaniach logicznych zawierających listy. Pusta lista to [ ]. Termin Cons(x,Nil) (tj. lista zawierająca element x, po którym następuje nic) jest zapisywany jako [x]. Lista kilku elementów, takich jak [A,B,C], odpowiada zagnieżdżonemu terminowi Cons(A,Cons(B,Cons(C,Nil)))

Domena pokrewieństwa

Pierwszym rozważanym przez nas przykładem jest dziedzina relacji rodzinnych lub pokrewieństwa. Ta domena obejmuje fakty, takie jak „Elizabeth jest matką Karola” i „Karol jest ojcem Williama” i zasady, takie jak „Babcia jest matką rodzica”. Oczywiście obiektami w naszej domenie są ludzie. Predykaty jednoargumentowe obejmują między innymi Male i Female. Relacje pokrewieństwa — rodzicielstwo, braterstwo, małżeństwo itd. — są reprezentowane przez predykaty binarne: rodzic, rodzeństwo, brat, siostra, dziecko, córka, syn, małżonek, żona, mąż, dziadek, wnuk, kuzyn, ciocia i wujek. Używamy funkcji Matki i Ojca, ponieważ każda osoba ma dokładnie jedną z nich, biologicznie (chociaż moglibyśmy wprowadzić dodatkowe funkcje dla matek adopcyjnych, matek zastępczych itp.). Możemy przejść przez każdą funkcję i orzeczenie, zapisując to, co wiemy, za pomocą innych symboli. Na przykład, czyjaś matka jest rodzicem, który jest kobietą:

Mąż to współmałżonek:

Rodzic i dziecko to odwrotne relacje:

Dziadek to rodzic Twojego rodzica:

Rodzeństwo to kolejne dziecko swojego rodzica:

Każde z tych zdań można traktować jako aksjomat domeny pokrewieństwa. Aksjomaty są powszechnie kojarzone z dziedzinami czysto matematycznymi — wkrótce zobaczymy niektóre aksjomaty liczb — ale są one potrzebne we wszystkich dziedzinach. Dostarczają podstawowych informacji faktycznych, z których można wyciągnąć użyteczne wnioski. Nasze aksjomaty pokrewieństwa są również definicjami; mają formę Aksjomaty definiują funkcję Matki i funkcję oraz predykaty Mąż, Mężczyzna, Rodzic, Dziadkowie i Rodzeństwo w kategoriach innych predykatów. Nasze definicje są „oddolne” w podstawowym zestawie predykatów (Dziecko, Kobieta itp.), w których ostatecznie definiuje się pozostałe. Jest to naturalny sposób budowania reprezentacji domeny i jest analogiczny do sposobu budowania pakietów oprogramowania przez kolejne definicje podprogramów z pierwotnych funkcji bibliotecznych. Zauważ, że niekoniecznie istnieje unikalny zestaw predykatów pierwotnych; równie dobrze moglibyśmy użyć Rodzica zamiast Dziecka. W niektórych dziedzinach, jak pokazujemy, nie ma jednoznacznie identyfikowalnego zestawu podstawowego. Nie wszystkie logiczne zdania dotyczące domeny są aksjomatami. Niektóre są twierdzeniami – to znaczy wynikają z aksjomatów. Rozważmy na przykład twierdzenie, że rodzeństwo jest symetryczne:

Czy to aksjomat czy twierdzenie? W rzeczywistości jest to twierdzenie, które logicznie wynika z aksjomatu definiującego rodzeństwo. Jeśli Pytamy bazę wiedzy o to zdanie, powinno ono zwrócić prawdę. Z czysto logicznego punktu widzenia baza wiedzy musi zawierać tylko aksjomaty, a nie twierdzenia, ponieważ twierdzenia nie powiększają zbioru wniosków wynikających z bazy wiedzy. Z praktycznego punktu widzenia twierdzenia są niezbędne do obniżenia kosztów obliczeniowych wyprowadzania nowych zdań. Bez nich system rozumowania musi za każdym razem zaczynać się od pierwszych zasad, podobnie jak fizyk musi na nowo wyprowadzać reguły rachunku różniczkowego dla każdego nowego problemu. Nie wszystkie aksjomaty są definicjami. Niektóre dostarczają bardziej ogólnych informacji o pewnych predykatach bez tworzenia definicji. Rzeczywiście, niektóre predykaty nie mają pełnej definicji, ponieważ nie wiemy wystarczająco dużo, aby je w pełni scharakteryzować. Na przykład nie ma oczywistego, ostatecznego sposobu na dokończenie zdania

Na szczęście logika pierwszego rzędu pozwala nam korzystać z predykatu Person bez całkowitego jego definiowania. Zamiast tego możemy napisać częściowe specyfikacje właściwości, które ma każda osoba, oraz właściwości, które czynią coś osobą:

Aksjomaty mogą być również „po prostu zwykłymi faktami”, takimi jak Mężczyzna(Jim) i Małżonka(Jim,Laura). Takie fakty tworzą opisy konkretnych przypadków problemowych, umożliwiając udzielenie odpowiedzi na konkretne pytania. Jeśli wszystko pójdzie dobrze, odpowiedziami na te pytania będą twierdzenia wynikające z aksjomatów. Często okazuje się, że oczekiwane odpowiedzi nie nadchodzą – na przykład od Małżonki (Jim, Laura) oczekuje się (zgodnie z prawem wielu krajów), że będzie w stanie to wywnioskować ¬Spouse(George, Laura); ale nie wynika to z podanych wcześniej aksjomatów – nawet po dodaniu Jim ≠ George. To znak, że brakuje aksjomatu.

Asercje i zapytania w logice pierwszego rzędu

Zdania są dodawane do bazy wiedzy za pomocą TELL, dokładnie tak jak w logice zdań. Takie zdania nazywamy twierdzeniami. Na przykład możemy stwierdzić, że Jan jest królem, Ryszard osobą, a wszyscy królowie są osobami:

Za pomocą ASK możemy zadawać pytania z bazy wiedzy. Na przykład,

Ask(K,B,King(John))

zwraca prawdę. Pytania zadawane za pomocą ASK nazywane są zapytaniami lub celami. Ogólnie rzecz biorąc, na każde pytanie, które logicznie wynika z bazy wiedzy, należy odpowiedzieć twierdząco. Na przykład, biorąc pod uwagę trzy powyższe stwierdzenia, zapytanie

Ask(K,B,Person(John))

powinien również zwracać true. Możemy zadawać kwantyfikowalne zapytania, takie jak

Odpowiedź jest prawdziwa, ale może nie jest to tak pomocne, jak byśmy chcieli. To trochę jak odpowiedź „Czy możesz mi podać godzinę?” z „Tak”. Jeśli chcemy wiedzieć, jaka wartość x sprawia, że zdanie jest prawdziwe, potrzebujemy innej funkcji, którą nazywamy ASKVARS,

i która daje strumień odpowiedzi. W tym przypadku będą dwie odpowiedzi: {x/John} i {x/Richard}. Taka odpowiedź nazywana jest listą substytucyjną lub wiążącą. ASKVARS jest zwykle zarezerwowany dla baz wiedzy składających się wyłącznie z klauzul Horn, ponieważ w takich bazach wiedzy każdy sposób urzeczywistnienia zapytania wiąże zmienne z określonymi wartościami. Tak nie jest w przypadku logiki pierwszego rzędu; w KB, któremu powiedziano tylko, że King(John) V King (Richard) nie ma jednego powiązania, które sprawia, że zapytanie jest prawdziwe ∃x King(x), nawet jeśli zapytanie jest w rzeczywistości prawdziwe.