+ Antworten
Ergebnis 1 bis 7 von 7

Prolog-thread

Eine Diskussion über Prolog-thread im Forum Hausaufgaben. Teil des Reallife-Bereichs; Ok folgendes Problem: Ich habe eine Prolog Datenbasis mit Reiseverbindungen und will ein Prädikat(?) erstellen wegVonUeberNach( X, [], Z). quasi ...

  1. #1
    Ehrenmember

    Registriert seit
    05.07.2002
    Beiträge
    4.803

    Prolog-thread

    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!?
    Geändert von deamon (05.05.2009 um 13:38 Uhr)

  2. #2
    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).

  3. #3
    Ehrenmember

    Registriert seit
    05.07.2002
    Beiträge
    4.803
    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

  4. #4
    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"

  5. #5
    Ehrenmember

    Registriert seit
    05.07.2002
    Beiträge
    4.803
    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)...
    Spoiler:
    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_...n_R.C3.A4tsels
    Geändert von deamon (19.05.2009 um 05:37 Uhr)

  6. #6
    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.

  7. #7
    Ehrenmember

    Registriert seit
    05.07.2002
    Beiträge
    4.803
    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

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

+ Antworten

Ähnliche Themen

  1. FUN-Thread für witze und sonstigen scheiss
    Von Sanse im Forum OFF-Topic
    Antworten: 11
    Letzter Beitrag: 26.02.2006, 20:29
  2. Kino-Film-Thread
    Von Sanse im Forum OFF-Topic
    Antworten: 46
    Letzter Beitrag: 14.10.2001, 20:32
  3. CnC Toplist Thread #2
    Von aIHurtYou im Forum United Talk
    Antworten: 1
    Letzter Beitrag: 14.10.2001, 16:45
  4. Star-Wars-Thread
    Von Sanse im Forum OFF-Topic
    Antworten: 29
    Letzter Beitrag: 25.08.2001, 11:27
  5. Lest euch den Thread mal durch.
    Von Bubba im Forum Kuba Libre
    Antworten: 13
    Letzter Beitrag: 23.08.2001, 15:52

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •