Berechnungen

Abstandsberechnungen mit Geokoordinaten

Wenn man die Geokoordinaten von zwei Punkten auf der Erde hat, kann man auch den Abstand der beiden Punkte (bezogen auf die Erdoberfläche) bestimmen. Da die Erdoberfläche durch eine Kugel angenähert werden kann, muss man für genaue Ergebnisse eine Berechnungsformel für den Abstand von Punkten auf der Kugeloberfläche benutzen. Da die im Folgenden betrachteten Städte alle nicht sehr weit entfernt liegen, kann man hier auch eine Näherungsformel zur Abstandsbestimmung benutzen, die auf dem Satz des Pythagoras basiert. Zu beachten ist dabei, dass der Abstand benachbarter Breitengrade etwa 111 km und der Abstand benachbarter Längengrade in Deutschland etwa 71 km beträgt.

Eine Formel zur näherungsweisen Berechnung des Abstandes von Stadt A mit lage(StadtA, nord(NA), ost(OA)) und Stadt B mit lage(StadtB, nord(NB), ost(OB)) lautet demnach:

Abstand = sqrt(((NA-NB)*111)2 + ((OA-OB)*71)2).

Wie kann eine solche Abstandsberechnung in Prolog durchgeführt werden? Die Wissensbasis zeigt, wie dies mit dem is-Operator erfolgen kann.

% Städte mit Geokoordinaten - Version 2
lage(berlin, nord(52.5), ost(13.0)).
lage('Köln', nord(50.93), ost(6.95)).
lage(mainz, nord(50), ost(8.27)).
lage(frankfurt, nord(50.1), ost(8.68)).
lage('München', nord(48.13), ost(11.57)).
lage(hamburg, nord(53.5), ost(10.0)).

abstand(StadtA, StadtB, A) :-
  lage(StadtA, nord(NA), ost(OA)),
  lage(StadtB, nord(NB), ost(OB)),
  A is sqrt(((NA-NB)*111)^2 + ((OA-OB)*71)^2).

Hier das Ergebnis einer Anfrage mit dem abstand-Prädikat:

?- abstand(mainz, 'Köln', A).
A = 139.42693893218765 ;
false.

Rechenoperatoren

Prolog stellt Operatoren für die üblichen Rechenoperationen zur Verfügung.

Rechenoperator Bedeutung
X + Y Addition
X - Y Subtraktion
X * Y Multiplikation
X / Y Float-Division
X // Y Integer-Division
X mod Y Rest bei der Integer-Division
X ** Y Potenzieren

Zusätzlich gibt es Operatoren wie z.B. sqrt oder roundfür spezielle mathematische Funktionen.

Berechnungen mit dem is-Operator

Zur Erschließung der Bedeutung des is-Operators betrachten wir die beiden folgenden Summenberechnungen.

% Summenberechnung
summe1(X, Y, Z) :- Z = X + Y.
summe2(X, Y, Z) :- Z is X + Y.

Die Auswertung entsprechender Anfragen zeigen den Unterschied zwischen dem =-Operator und dem is-Operator auf.

?- summe1(2, 3, S).
S = 2+3 ;
false.

?- summe2(2, 3, S).
S = 5 ;
false.

Beim =-Operator werden die Variablen so belegt, dass Termgleichheit entsteht. Der is-Operator führt dagegen zu einer numerischen Auswertung von Rechentermen.

Aufgabe 1

Entwickle ein Prädikat summe/2, mit dem man die Summe der Zahlen in einer Liste bestimmen kann.

46 ?- summe([1, 2, 4, 7], L).
L = 14 ;
false.

Aufgabe 2

Mit Hilfe des abstand-Prädikats soll ein Prädikat laenge_der_route/2 festgelegt werden, mit dem man die Länge einer Route über mehrere Städte der Wissensbasis bestimmen kann.

?- laenge_der_route([frankfurt, mainz, 'Köln', hamburg], L).
L = 528.7334549047451 ;
false.
X

Fehler melden

X

Suche