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 round
fü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.