2010-12-16 24 views
0

Ich bin neu in Prolog, und ich muss ein Programm über das Wasser Krüge schreiben. Mein Problem betrifft den Ausgangszustand der Krüge und die Abfrage Bildung. Die Abfrage hat folgende Form:Prolog Frage Frage

Bedeutung j1 gefüllt mit 1 Gallone Wasser. j1 repräsentiert einen der Krüge; der andere ist j2. Initally, ich habe

filled(j1,0) 
filled(j2,5) 
capacity(j1,2) 
capacity(j2,5) 

ich wirklich dankbar sein würde, wenn Sie mir Informationen liefern über die folgenden:

Frage A: Muss ich Anfangszustand des j1 in meinem Programm zu deklarieren? filled(j1,0)

Frage B: Ich muss mein Programm eine Lösung für gefüllt (j1,1) finden machen. Dafür habe ich ein paar Ideen, aber was ich nicht sicher über, ist, wie gefüllt (J, Volume) von Abfrage und myPredicate aktualisieren.

Ich bin sehr verwirrt, da ich den Anfangszustand filled(j1,0) haben und jetzt Ich habe einen filled(j1,1) in myPredicate erstellen. Also sollte ich eine Form von filled(J,Volume) in myPredicate haben, so dass die Abfrage wahr statt false zurückgibt.

Wie integriere ich filled(J,Voume) innerhalb myPredicate so, wenn die obige Abfrage ausgeführt wird, kann ich korrekte Antwort zeigen?

+2

* "... und ich ** habe ** ein Programm zu schreiben ..." * - Ist das Hausaufgaben? – thkala

+1

Ich bin nicht klar, was genau das Problem ist. Kannst du mir eine vollständige Beschreibung des Problems geben, wie es von der Universität kommt? Nicht wissend, was das genaue Problem hier ist, kann ich dir keine Antwort geben, aber .. hier fand ich ein sehr ähnliches Problem zu deinem mit Antwort, die bereits gegeben http://www.informatik.uni-freiburg.de/~ki/ Lehre/ws0708/logic/prolog7.pdf, Folie 17, – matcheek

Antwort

-2

Beispielprogramm mit einem übergebenen Parameter, einer initialen Tatsache und einer iterativen Aufgabe. Iteration erfolgt durch Rekursion. Vor jedem Wiedereintritt kann der Wert, der mit einem bestimmten Parameter in Beziehung steht, effektiv für den nächsten Durchlauf aktualisiert werden.

my_loop(N) :- N > 10. 

my_loop(N) :- N =< 10, 
    write(N), nl, 
    Nextin is N + 1, 
    my_loop(Nextin). 

:- my_loop(1). 

A:
Die angegebenen Informationen (Fakten) durch das Programm benötigt. Sie können über die Tastatureingabe als anfängliche Argumente für ein Prädikat oder als Fakten in der Datenbank zur Verfügung gestellt werden, wie Sie vorgeschlagen. Auch nur für spezielle Situationen vorgeschlagen, können die Fakten in einige Prädikate oder Regeln fest codiert werden.

Unten und oben sind Beispiele für die Übergabe der Ausgangsinformationen als Parameter: :- my_predicate(args...).

Wenn es viele Fakten gibt, ist die Datenbank am besten. Ein paar Fakten, die müssen jedes Mal ändern, ist am besten von der Tastatur erhalten. Ansonsten ist es wahrscheinlich egal.

:- my_predicate([fill(j1,0),fill(j2,5)], Answer), 
    write(Answer), 
    nl. 

B:

Siehe meine _ Schleife Beispiel:

In my_loop, die Aufgabe des Zählens [1..10] iterativ gelöst wird. Die Vorgaben: 1 wird als Parameter übergeben, hauptsächlich, weil das Programm dasselbe Over-and-Over ausführt:
1. nimm eine Zahl (N); Beende wenn es zu groß ist. Ansonsten ...
2. drucken Sie es aus.
3. Die nächste Zahl (N + 1)
4. Wiederholen

10 ist hart codiert berechnen. Es könnte eine Tatsache gewesen sein: stop_after(10).

Nun werden die Daten manipuliert werden, wird die Variable N in my_loop und {j1, j2} in myPredicate eigentlich nicht wieder werden neu zugeordnet Über und Über müssen: my_loop See. Wieder Geben Sie die Berechnung, wenn es Zeit ist, wieder die gleiche , was zu tun, aber mit unterschiedlichen Parametern:

cap(j1,2). 
cap(j2,5). 

my_predicate(Status, Answer) :- 
    got_juice(Status,0), 
    Answer=Status. 

%%% Instead of changing values, rerun comp. with new values 
%%% based on a computation made from the old ones. 
my_predicate([filled(j1,J1), filled(j2,J2)], Answer) :- 
    Used is J1 + J2, 
    got_juice(Used, J), J \= 0, 
    cap(j1,C1), cap(C2), 
    %% Use cap and filled to add more to filled.. 
    NextJ1 is J1 + ..., 
    NextJ2 is J2 + ..., 
    my_predicate(filled(j1,NextJ1), filled(..., Answer). 

HINWEIS:
oben Das Prädikat ist nur Iteration in Prolog zu demonstrieren ", um die Parameter des Verwendens myProgaram ". Für eine tatsächliche Implementierung siehe das Programm, das in dem Kommentar von Matcheek vorgeschlagen wird.

+0

-1 Zu detaillierte Antwort auf die Hausaufgabenfrage. –