Lösen des logischen Puzzles mit verbesserter Ausgabe
... [ Seminarthemen SS01
] ... [ Inhaltsverzeichnis ] ... [
Ressourcen ] ...
Übersicht: Lösen des logischen Puzzles mit verbesserter Ausgabe
Einleitung
In diesem Kapitel wird eine andere Möglichkeit geschildert logische
Puzzle zu lösen. Besonders die Ausgabe der Lösung wird
entscheidend verbessert, so daß man nach der Programmausführung
sofort die Zuordnungen erkennen kann. Um diesen Lösungansatz zu verstehen,
sollte man sich ein wenig mit der Verarbeitung von Listen auskennen.
Quelltext
% Einbinden der Bibliothek
:- use_module(library(fd)).
:- writeln("'start(Units)' in der Anfrage eingeben'").
start(Units):-
% u(Tag,name,ort,problem)
Units = [
u(1, _, _, _),
u(2, _, _, _),
u(3, _, _, _),
u(4, _, _, _),
u(5, _, _, _)],
[FB,FC,FH,HM,HP,OA,OB,OF,OH,OM,WM,ZH,RB,WH,AF]
:: 1..5,
Constraints = [
u(FB, bogo, _, _),
u(FC, clemens, _, _),
u(FH, hasel, _, _),
u(HM, magner, _, _),
u(HP, puetz, _, _),
u(OA, _, aue, _),
u(OB, _, buchengasse, _),
u(OF, _, finkenweg, _),
u(OH, _, hauptstrasse, _),
u(OM, _, maxfrischallee, _),
u(WM, _, _, waschmaschine),
u(ZH, _, _, zentralheizung),
u(RB, _, _, rohrbruch),
u(WH, _, _, wasserhahn),
u(AF, _, _, abfluss)],
% Aussage 1
HM ## 1, HP ## 1, WM ## 1,
% Aussage 2
HM #= RB, HM + 1 #= OF,
% Aussage 3
OA + 1 #= AF, WM ## OB, OB ## HP,
% Aussage 4
FH ## WH, FH #= OH, OM #= 4,
% Aussage 5
FB #= 5, FB ## AF,
% Aussage 6
FB ## ZH, FC ## ZH, FH ## ZH,
psubset(Constraints, Units).
psubset([],_).
psubset([H|T],List) :- member(H,List), psubset(T,List).
Erklärung des Quelltextes
Es werden zwei Listen (Units + Constraints) definiert, deren Elemente die
gleiche Struktur u(Tag,name,ort,problem) besitzen. Nach Auswertung
der Einschränkungen wird die Regel psubset(Constraints, Units)
aufgerufen. Nachdem die Liste Constraints in H und T (H-erstes
Listenelement, T-Restliste) verarbeitet wurde, wird durch
member(H,List)
geprüft, ob das Element H in der Liste
Units enthalten
ist. Dieses ist genau dann der Fall, wenn der Wertebereich der Variablen
mit dem Tag übereinstimmt und die entsprechende anonyme Variable (
_ ) in der Struktur noch nicht belegt ist. Dann wird mit der Restliste
T
erneut die Regel psubset(T,List) aufgerufen. Dieser Vorgang
wiederholt sich so lange, bis die Restliste leer ist, so daß die
erste Regel psubset([],_) angewandt werden kann und man eine Lösung
erhält. Sollte ein Element nicht mehr Bestandteil der Liste Units
sein, weil die anonyme Variable durch einen anderen Wert schon belegt ist,
erfolgt ein backtracking bis ein Element der Liste
Constraints auch
noch ein anderes Element der Liste Units zugeordnet werden kann.
Lösung
Nach Programmausführung wird der Inhalt der Variablen Units,
die fünf Listenelemente mit der richtigen Zuordnung, ausgegeben.
Nachtrag
Das Beispiel des Installateurs ist aus einem Rätzelbuch, so daß
die Aufgabe auch mit Hilfe einer Tabelle zu lösen ist.
In den Online-Ressourcen ist eine Internetadresse angegeben, die auf
logische Puzzles verweist, welche nicht mehr durch Einsatz einer Tabelle
zu lösen sind. Dort ist auch das Beispiel mit den Sportlern des Monats
aufgeführt.
... [ Seminarthemen SS01
] ... [ Inhaltsverzeichnis ] ... [
Ressourcen ] ...