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.
 
Nach oben

... [ Seminarthemen SS01 ] ... [ Inhaltsverzeichnis ] ... [ Ressourcen ] ...