• Wir werden in den nächsten Tagen verschiedene Wartungsoperationen und Optimierungen am Server durchführen. Es wird zu mehreren Ausfällen kommen, die teilweise auch mehrere Stunden umfassen können.

Prolog-thread

deamon

Ehrenmember
Joined
Jul 5, 2002
Messages
4,801
Points
300
Ok folgendes Problem: Ich habe eine Prolog Datenbasis mit Reiseverbindungen und will ein Prädikat(?) erstellen

wegVonUeberNach( X, [], Z).
quasi von X über die Liste nach Z. Meine Idee war jetzt einfach X und Z jeweils vorne und hinten anzuhängen und dann zu testen ob der Weg in der Liste true ist... aber irgendwie kriege ich das nicht hin

Code:
moeglich(northeim,elvese,bahn).
moeglich(northeim,frankfurt,zug).
moeglich(frankfurt,newyork,flugzeug).
moeglich(elvese,newyork,schiff).
moeglich(elvese,bovenden,bus).
moeglich(bovenden,northeim,bus).

verbindungVonNachMit( X, Y, Z):- moeglich( X, Y, Z).
verbindungVonNachMit( X, Y, Z):- moeglich( Y, X, Z).

route([]).
route([X,Y|_]):- verbindungVonNachMit(X,Y,_).
route(X,[Y|_]):- verbindungVonNachMit(X,Y,_).

% wegVonUeberNach( X, [], Z):- route([]).

€: dat sollte eigtl ins Hausaufgabenforum -_-

€: ich kann threads verschieben!?
 
Last edited:
Ich habe mit Prolog bisher noch nicht gearbeitet, daher musste ich es mir gerade erstmal anschauen.
Schade dass man in GNU Prolog nicht mit Copy + Paste arbeiten kann sondern alles eintippen muss :(

Code:
verbindungVonNachMit( X, Y, Z):- moeglich( X, Y, Z).
verbindungVonNachMit( X, Y, Z):- moeglich( Y, X, Z).
Gehen die Verbindungen den immer in beide Richtungen?

Ich würde lieber
Code:
verbindung(northeim,elvese,bahn).
verbindung(elvese,northeim,bahn).

verbindung(northeim,frankfurt,zug).
verbindung(frankfurt,northeim,zug).

verbindung(frankfurt,newyork,flugzeug).
verbindung(newyork,frankfurt,flugzeug).

verbindung(elvese,newyork,schiff).
verbindung(newyork,elvese,schiff).

verbindung(elvese,bovenden,bus).
verbindung(bovenden,elvese,bus).

verbindung(bovenden,northeim,bus).
verbindung(northeim,bovenden,bus).
schreiben und es verbindung nennen.

Dann habe ich eine andere Regel als rekursive Schleife hinzugefügt, welche Prüft ob es einen Weg von X nach Z gib (ggf. mit Zwischenstationen).

Code:
verbindungVonNach( X, Y) :- 
	verbindung( X, Y, _).

verbindungVonNach( X, Y) :- 
	verbindung( _, Y, _),
	verbindung( X, Z, _),
	verbindungVonNach( Z, Y).
ich habe "verbindungVonNachMit" entfernt, denn dies ist jetzt nur noch ein Alias ist und keinen eigenen Nutzen mehr hat (wenn man es wie oben auftrennt).

Die Abfrage von
Code:
verbindung( _, Y, _)
dient dazu um einen Overflow zu vermeiden, falls es das Ziel gar nicht gibt (denn sonst würde er eine unendliche lange Kette aufbauen).

Und dann habe ich ein sehr simples verbindungVonUeberNach geschrieben
Code:
verbindungVonUeberNach( X, [], Y) :- 
	verbindungVonNach( X, Y).
	
verbindungVonUeberNach( X, [Y|Ueber], Z) :- 
	verbindungVonNach( X, Y),
	verbindungVonUeberNach( Y, Ueber, Z).
du müsstest jetzt noch ausschließen, dass man nicht ständig zurückfliegt etc. (denn mit dieser Implementierung ist auch bei einer Abfrage von
A nach C über B ein Weg wie
A -> B -> A -> D -> C
richtig.

Der gesamte Code:
Code:
verbindung(northeim,elvese,bahn).
verbindung(elvese,northeim,bahn).

verbindung(northeim,frankfurt,zug).
verbindung(frankfurt,northeim,zug).

verbindung(frankfurt,newyork,flugzeug).
verbindung(newyork,frankfurt,flugzeug).

verbindung(elvese,newyork,schiff).
verbindung(newyork,elvese,schiff).

verbindung(elvese,bovenden,bus).
verbindung(bovenden,elvese,bus).

verbindung(bovenden,northeim,bus).
verbindung(northeim,bovenden,bus).

verbindungVonNach( X, Y) :- 
	verbindung( X, Y, _).

verbindungVonNach( X, Y) :- 
	verbindung( _, Y, _),
	verbindung( X, Z, _),
	verbindungVonNach( Z, Y).
	
verbindungVonUeberNach( X, [], Y) :- 
	verbindungVonNach( X, Y).
	
verbindungVonUeberNach( X, [Y|Ueber], Z) :- 
	verbindungVonNach( X, Y),
	verbindungVonUeberNach( Y, Ueber, Z).

Wenn man verbindungVonNachMit nutzt würde es so aussehen (jedoch kann man dann nur sehr unschön Einweg-Verbindungen definieren):
Code:
verbindung(northeim,elvese,bahn).
verbindung(northeim,frankfurt,zug).
verbindung(frankfurt,newyork,flugzeug).
verbindung(elvese,newyork,schiff).
verbindung(elvese,bovenden,bus).
verbindung(bovenden,northeim,bus).

verbindungVonNachMit( X, Y, Z) :- 
	verbindung( X, Y, Z).
verbindungVonNachMit( X, Y, Z) :- 
	verbindung( Y, X, Z).

verbindungVonNach( X, Y) :- 
	verbindungVonNachMit( X, Y, _).

verbindungVonNach( X, Y) :- 
	verbindungVonNachMit( _, Y, _),
	verbindungVonNachMit( X, Z, _),
	verbindungVonNach( Z, Y).
	
verbindungVonUeberNach( X, [], Y) :- 
	verbindungVonNach( X, Y).
	
verbindungVonUeberNach( X, [Y|Ueber], Z) :- 
	verbindungVonNach( X, Y),
	verbindungVonUeberNach( Y, Ueber, Z).
 
dankeschön :)

verbindungVonNachMit stellt sicher dass moeglich() Hin und Rückfahrt mit dem Verkehrsmittel ermöglicht.

overflow und backtracking sind afaik noch unwichtig dabei. Das Beispiel bzw die Übungsstunde eben hat mir so einiges an Erleuchtung gebracht.

Rekursion ist eine Schlampe die ich noch lernen muss zu ficken :D
 
Wenn du mal etwas in Scheme oder LISP machen musst, dann ist Rekursion der Weg zur Erleutung ^^.

Wie sagte unser Prof mal "Scheme ist auf Rekursion optimiert" :D
 
Wie löst man ein puzzle folgender Form am Besten? Ich hab die Variablen A bis I die mit verschiedenen Zahlen von 1-16 ( x_X) belegt werden sollen. Die Rechenzeichen stimmen nicht, und für x1-6 habe ich Ergebnisse.. Ich hab erstmal soviele Relationen gesucht wies gibt(hoffentlich machen die Sinn), die Variablen mit Zahlen belegt und naja dann isses ein ziemlich lahmer bruteforce Versuch der irgendwie nicht fruchtet(mehr oder weniger so wies bei wikipedia steht, bei der letzten Aufgabe hat das noch in annehmbarer Zeit funktioniert)...
http://pastebin.com/mb170d43

A + B + C = x1
+ h + h +
D + E + F = x2
+ h + h +
G + H + I = x3
= h = h =
x4 x5 x6

die h's sind zur formatierung http://de.wikipedia.org/wiki/Prolog...#L.C3.B6sen_eines_mathematischen_R.C3.A4tsels
 
Last edited:
Sind die Variablen A - I paarweise verschieden ?

Außerdem scheint irgendwas nicht zu stimmen, denn
D - E * F ist niemals 25, wenn D,E,F zwischen 1 bis 16 liegen.

Im übrigen verlangsamst du es nur, wenn du weitere Beziehungen aufschreibst, da es nur 6 wesentliche Gleichungen gibt.

Es wird wohl ungefähr so aussehen (wenn sie paarweise vers. sind), wobei er einfach stirbt, wenn es keine Lösung gibt (was z.B. hier der Fall ist).

Code:
gen(A,B,C,D,E,F,G,H,I) :- permutation([A,B,C,D,E,F,G,H,I,_,_,_,_,_,_,_],[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]).

gl1(A,B,C) :- (A*B+C) =:= (43).
gl2(D,E,F) :- (D-E*F) =:= (25).
gl3(G,H,I) :- (G+H/I) =:= (9).
gl4(A,D,G) :- (A+D-G) =:= (10).
gl5(B,E,H) :- (B+E+H) =:= (18).
gl6(C,F,I) :- (C-F+I) =:= (9).

loesung :- gen(A,B,C,D,E,F,G,H,I), gl1(A,B,C), gl2(D,E,F), gl3(G,H,I), gl4(A,D,G), gl5(B,E,H), gl6(C,F,I), 

write(A),nl,write(B),nl,write(C),nl,write(D),nl,write(E),nl,write(F),nl,write(G),nl,write(H),nl,write(I),nl.
 
achso, es sollte dabei von links nach rechts, bzw oben nach unten gerechnet werden.

Im übrigen verlangsamst du es nur, wenn du weitere Beziehungen aufschreibst, da es nur 6 wesentliche Gleichungen gibt.
alles klar :D

ich bin aufjedenfall auf die Lösung gespannt, ka wie das unter einer Sekunde gehen soll o_O..
 
Back
Top Bottom