LEERKERN

8.1 Eenvoud en uitdrukkingskracht

Introductie

Lees uit Stefik: paragraaf 1.4 (pagina 107 tot en met 131).

Bij de verschillende paragrafen uit het boek van Stefik zijn de volgende opmerkingen te maken.

8.1.1 Opmerkingen bij paragraaf 1.4.1 van Stefik

Productieregels vormen de basis van regelgebaseerde kennissystemen. Zij specificeren acties die onder bepaalde voorwaarden uitgevoerd moeten of kunnen worden. Anders dan een traditioneel programma, waarbij de uit te voeren actie door de plaats van de actie in het programma bepaald wordt, wordt hier de uit te voeren actie bepaald door de toestand van de symbolische representatie. In het voorbeeld, figuren 1.60 tot en met 1.62, bestaat de symbolische representatie uit: de kleur van de verkeerslichten, de toestand van de sensor en toestand van de tijdschakelaars.

8.1.2 Opmerkingen bij paragraaf 1.4.2 van Stefik

In deze paragraaf wordt het ‘universal computation concept’ beschreven. Dit concept maakt het mogelijk om een gebruiker een andere programmeer- of kennisrepresentatietaal te laten gebruiken dan die door een computer zelf gebruikt wordt. Men kan dit zien als een vraag die in het Engels gesteld wordt, die men naar het Nederlands vertaalt, in het Nederlands beantwoordt, en waarvan men het antwoord tenslotte weer naar het Engels vertaalt. Hoe men de vraag van het Engels naar het Nederlands moeten vertalen en hoe men het antwoord van het Nederlands naar het Engels moeten vertalen, wordt beschreven in Nederlands. Men hoeft op deze manier geen Engels te kunnen spreken om een in het Engels gestelde vraag te kunnen beantwoorden. Men kan de vraag in feit in elke willekeurige taal beantwoorden, zolang men maar weet hoe men de vraag naar deze taal moet vertalen en hoe men het antwoord moet terugvertalen. Dit is in feite de essentie van het ‘universal computation concept’.

Een goed voorbeeld binnen de informatica van dit concept is de programmeertaal Java. Een Java-programma draait op elke machine waarop een ‘Java virtual machine’ draait. De JVM is in feite de vertaler.

> Extra uitleg 8.1.1

8.1.3 Opmerkingen bij paragraaf 1.4.3 van Stefik

In deze paragraaf wordt getoond hoe kennis en informatie op verschillende wijzen gebruikt kan worden. Een beschrijving van een wiskundige functie kan bijvoorbeeld gebruikt worden om een functiewaarde te bepalen, maar ook om de afgeleide functie te bepalen. De programmeertaal LISP biedt, bijvoorbeeld, de mogelijkheid om een functie op deze verschillende wijzen te hanteren.

LISP is een taal die vooral onder Amerikaanse onderzoekers van kunstmatige intelligentie populair is. De taal is gebaseerd op lijsten waarvan het begin met ‘(’ wordt aangeduid en het einde met ‘)’. De eerste term van een lijst duidt een functie aan. Dus
‘(+ 1 2)’ staat voor ‘1 + 2’. De functie ‘defun’ in ‘(defun f (x y) (+ x y))’ kent aan het symbool ‘f’ de afbeelding van ‘x’ en ‘y’ naar ‘x + y’ toe. Dus: f(x, y) = x + y. De lijst ‘(f 1 2)’ staat voor: f(1, 2) en geeft dus de waarde 3.

> Extra uitleg 8.1.2

8.1.4 Opmerkingen bij paragraaf 1.4.4 van Stefik

In deze paragraaf wordt het voordeel besproken van een representatie waarbij twee patronen op elkaar afgebeeld kunnen worden (pattern matching). Pattern matching kan de beschrijving van de wijze waarop symbolen gemanipuleerd moeten worden, sterk vereenvoudigen.

Een manier om op eenvoudige wijze te beschrijven dat de afgeleide van (f(x))n gelijk is aan n · (f(x))n-1 · f '(x), krijgen we wanneer we twee patronen op elkaar kunnen afbeelden. In dat geval kunnen we de volgende regel voor de afgeleide formuleren: ‘als afgeleide(?u^n), dan n * (?u^(n 1)) * afgeleide(?u)’. Wanneer we deze regel toepassen op: (ln(x))^n, wordt de variabele ?u gelijk gesteld aan ln(x). We krijgen dus: n * (ln(x)^(n – 1))*afgeleide(ln(x)). Wat we hier zien, is dat we niet meer hoeven te specificeren hoe we de expressie (ln(x))^n uit elkaar moeten rafelen. Pattern matching is een zeer krachtig hulpmiddel dat we in veel kennisrepresentaties tegen komen.

8.1.5 Opmerkingen bij paragraaf 1.4.5 van Stefik

In deze paragraaf wordt ingegaan op de relatie tussen de uitdrukkingskracht van een kennisrepresentatie en de snelheid waarmee vragen kunnen worden beantwoord en problemen kunnen worden opgelost. Helaas blijken een grote uitdrukkingskracht en een grote snelheid niet samen te gaan. Eersteordepredikaatlogica heeft bijvoorbeeld een grote uitdrukkingskracht. Maar of een uitspraak waar of onwaar is, is niet altijd efficiënt en soms helemaal niet te bepalen.

Een relationele gegevensbank biedt een efficiënte methode om ware atomaire predikaten op te slaan. Andere uitspraken, zoals bijvoorbeeld een disjunctie: ‘de trein vertrekt van spoor 3 of 4’, of een negatie: ‘de trein vertrekt niet van spoor 4’, kunnen niet worden opgeslagen. Een gegevensbank kan slechts ware atomaire gegevens opslaan: ‘de trein vertrekt van spoor 3’. Als deze opsomming van ware feiten echter volledig is, elke waar feit staat in de gegevensbank, moet elk feit dat er niet in staat, onwaar zijn. Dus als niet in de gegevensbank staat dat de trein van spoor 4 vertrekt, dan is de uitspraak: ‘de trein vertrekt van spoor 4’ onwaar. De aanname dat de gegevensbank alle ware gegevens bevat, heet de ‘closed world assumption’, de gesloten-wereldaanname. Met behulp van deze aanname kunnen we ook bepalen wat onwaar is.

Logische programmeertalen bieden meer uitdrukkingskracht dan relationele gegevensbanken, omdat naast ware atomaire predikaten ook algemeen geldende regels kunnen worden weergegeven. Bovendien kunnen we aangeven dat een atomair predikaat en een regel gelden voor elk object. Ontkenningen en disjuncties van atomaire predikaten kunnen echter niet gebruikt worden.

Logische programmeertalen gebruiken vaak twee aannames om de uitdrukkingskracht te vergroten. De eerste aanname veronderstelt dat de objecten die in een logisch programma genoemd worden, alle waarneembare objecten zijn. Dit is de ‘domain closure assumption’. Stefik duidt dit foutief aan als de ‘closed world assumption’. Een tweede aanname die gebruikt wordt, is ‘failure as negation’. Deze aanname wordt ook wel ‘negation by failure’ genoemd. De aanname veronderstelt dat alles wat niet afleidbaar is, onwaar is. Dit lijkt erg op de ‘closed world assumption’. Het verschil is echter dat we niet altijd kunnen bepalen of een uitspraak afleidbaar is. Om dit in te zien, bekijk het volgende Prolog-programma: p(X) :- not(q(X)); q(X) :- q(f(X)). Dit betekent dat p waar is als we niet kunnen bewijzen dat q waar moet zijn. Wanneer Prolog probeert te bewijzen dat p(a) waar is, moet het aantonen dat q(a) niet bewijsbaar is. Hiertoe probeert Prolog q(a) te bewijzen, gebruikmakend van q(X) :- q(f(X)). Dat betekent Prolog probeert q(f(a)) te bewijzen. Om q(f(a)) te bewijzen, probeert Prolog, gebruikmakend van q(X) :- q(f(X)), q(f(f(a))) te bewijzen, enzovoorts. Het zal daardoor nooit tot een beslissing komen. Volgens de ‘closed world assumption’ moet p(a) waar zijn.

Eersteordepredikaatlogica biedt geen mogelijkheid om de gerepresenteerde kennis en informatie te ordenen. Semantische netwerken en frames bieden wel deze mogelijkheid. Hierdoor wordt het opnieuw eenvoudiger om kennis te representeren. Semantische netwerken en frames bezitten een aantal voorgedefinieerde relaties. Deze worden ‘epistemological primitives’ of kennisbouwstenen genoemd. Het voordeel van deze voorgedefinieerde relaties is dat men de afleidingen die men met deze relatie kan maken, niet meer hoeft te specificeren. Men hoeft bijvoorbeeld niet meer overerving te specificeren: "P"Q[is_a(P, Q) ® "x[P(x) ® Q(x)]]. Merk op dat dit een tweedeorde formule is. In de eersteordepredikaatlogica moeten we voor iedere instantie van de predikaten P en Q een aparte formule introduceren.

Frames bieden nog een extra mogelijkheid om kennis en informatie te ordenen. Zij bieden de mogelijkheid om de structuur van objecten van eenzelfde soort (type) vast te leggen. Deze structuur vormt een raamwerk, dat alleen maar ingevuld hoeft te worden. Bovendien kan men, zolang bepaalde waarden nog onbekend zijn, standaardwaarden automatische laten invullen; verstekwaarden (default). Tenzij anders gespecificeerd is, is bijvoorbeeld de kleur van een brandweerauto rood.

> Extra uitleg 8.1.3

8.1.6 Opmerkingen bij paragraaf 1.4.6 van Stefik

In deze paragraaf wordt het verschil tussen het kennis- en het symboolniveau besproken. De definitie van het kennisniveau (knowledge level) die hier gebruikt wordt, is niet geheel correct. Het kennisniveau is een abstractie van het symboolniveau, waarbij we representatieaspecten buiten beschouwing laten. Het kennisniveau bestaat uit de kennis en informatie die een agent of het kennissysteem bezit, de acties die het kan uitvoeren, en de doelen die het nastreeft. Het gedrag van de agent of het kennissysteem wordt bepaald door het principe van rationaliteit, de agent of het kennissysteem probeert zo goed mogelijk zijn doelen na te streven door het kiezen van acties op grond van de beschikbare kennis en informatie. Het kennisniveau zegt dus niets over de representie en de inferentiemechanismen die op het symboolniveau gebruikt worden. Er zijn vele representaties mogelijk. Dit betekent ook dat op het kennisniveau geen betekenis aan symbolen worden toegekend. Dit is een onderdeel van de gekozen representie en behoort dus op het symboolniveau thuis.

Beschouw, om het verschil tussen de twee niveaus te illustreren, een taxichauffeur die u naar het vliegveld brengt. De taxichauffeur moet hiervoor kennis hebben van het wegennet, de verkeersregels en het gedrag van weggebruikers. De acties die de taxichauffeur moet kunnen uitvoeren, zijn het waarnemen van de omgeving en het besturen van de taxi. Het doel is in dit geval, u naar het vliegveld brengen.

Deze beschrijving van de taxi is een beschrijving op het kennisniveau. Dit kan op verschillende wijzen gerepresenteerd worden op het symboolniveau. Een menselijke taxichauffeur gebruikt waarschijnlijk een andere symbolische representatie dan een robot-taxichauffeur.

> Opgave 8.1.1

> Opgave 8.1.2

> Opgave 8.1.3

> Opgave 8.1.4

> Opgave 8.1.5

> Opgave 8.1.6

> Opgave 8.1.7

> Opgave 8.1.8