Wissenschaft
Copyright © 2024 Jiri Kriz, www.nosco.ch

8Prolog Potpouri (oder: Spass mit Prolog)

Lösungen

8.1Krypto­arithmetische Rätsel

Lösen Sie das Rätsel:

    S E N D
 +  M O R E
------------
  M O N E Y

Verschiedene Buchstaben stehen für verschiedene Ziffern des Dezimalsystems.

Implementieren Sie dazu eine allgemeine Methode zur Lösung kryptoarithmetischer Rätsel:

puzzle( X, Y, Z).

X, Y, Z sind Listen von Buchstaben (Prolog Variablen)

oder bekannten Ziffern und "Z = X + Y" (elementweise).

Beispiel:

?- puzzle( 
[0, S,E,N,D], 
[0, M,O,R,E], 
[M,O,N,E,Y]).
 ⇒  S = 9, E = 5, N = 6, D = 7, M = 1, O = 0, R = 8, N = 6, Y = 2

Hinweis: Folgende Prädikate könnten nützlich sein:

add1( X, Y, Z, Cin, Cout)
/* 10 * Cout + Z = X + Y + Cin. */

delete( X, Y, Z)
/* Die Liste Z entsteht aus der Liste Y durch nichtdeterministisches Löschen des Elementes X.*/

Lösung 8.1

8.2Drei Freunde

Beat, Daniel und Michael wohnen in verschiedenen Städten und haben verschiedene Berufe. Sie treffen sich jedes Jahr beim Silvesterlauf in Zürich, wo auch ein von ihnen wohnt. Diesmal wurde Michael vor dem Berner klassiert. Daniel war schneller als der Beamte. Am besten war aber, wie immer, der Sportlehrer. Daniel wohnt in Basel und Michael ist Arzt.

Who is who ?

Lösung 8.2

8.3Ein Intelligenztest

In einem Intelligenztest hat ein Prolog Programm am besten abgeschnitten. Damit wurde endgültig die Realisierbarkeit der Künstlichen Intelligenz bewiesen. Es wurden Sequenzen von einigen Zahlen vorgegeben und die passende Folgezahl sollte erraten werden. So hat es ausgesehen:

?- iq( [ 2, 4, 6], X).  ⇒  X = 8
?- iq( [ 4, 7, 12, 19, 28], X).  ⇒  X = 39
?- iq( [ 1, 1, 2, 3], X).  ⇒  X = 5
?- iq( [ 1, 2, 4, 7], X).  ⇒  X = 11

Schreiben Sie ein solches intelligentes Programm.

Lösung 8.3

8.4Sprach­übersetzung

Den Studenten der Angewandten Künstlichen Intelligenz ist ein Durchbruch bei der maschinellen Sprachübersetzung gelungen! Sie haben ein einfaches Programm entwickelt (nur einige Prolog-Zeilen!), das Deutsch ins Englisch übersetzt. Das Programm lernt sogar und erzielt somit immer bessere Resultate. Es arbeitet nach der folgenden Strategie:

  1. Teilsätze (resp. ganze Sätze) werden übersetzt, falls möglich (falls vorgesehen).
  2. Einzelne Worte werden übersetzt, falls möglich.
  3. Unbekannte Worte werden angezeigt.

Neue Übersetzungen können vom Benutzer eingegeben werden. Sie werden vom Computer gespeichert. Beispiele:

?- consult( 'dictionary.pdb').    
/*  konsultiert das File mit den bisherigen Übersetzungen, z.B.:
word( er, he).
word( geht, goes).
sequence( [ nach, hause], [ home]).
sequence( [ zu, hause], [ at, home]).
*/

?- translate( [ er, geht, nach, hause], E). 
 ⇒  E = [ he, goes, home]

?- translate( [ er, ist, zu, hause], E). 
 ⇒  E = [ he, ?, at, home]

?- learn( ist, is). 
 ⇒  OK, teacher!

?- translate( [ das, haus, ist, gross], E). 
 ⇒  E = [ ?, ?, is, ?]

?- translate( [ wie, geht, es, ihnen], E). 
 ⇒  E = [ ?, goes, ?, ?]
?- learn( [ wie, geht, es, ihnen], [ how, are, you]).
 ⇒  OK, teacher!
?- translate( [ wie, geht, es, ihnen], E).
 ⇒  E = [ how, are, you]

?- save( 'dictionary.pdb').
/* Die internen Übersetzungen werden auf ein File geschrieben */

Lösung 8.4