CLP-Programme in SWI-Prolog

Hallo,

ich muss eine Ausarbeitung über Constraint Logic Programming schreiben. Ich habe mich erstmal ein bisschen eingelesen und danach versucht, kleine Beispielprogramme in SWI Prolog zu schreiben. Und genau hier liegt mein Problem, die Programme wollen einfach nicht laufen. Ich habe da anscheinend irgend etwas grundsätzlich falsch verstanden.

Ein Beispiel, die Fibonacci Zahlen:

use_module(library(clpr)).
fib(0,1).
fib(1,1).
fib(N,R1+R2):- N>1,
fib(N-1,R1),
fib(N-2,R2).

Das Programm compiliert, liefert aber immer nur false als Lösung. Der Code sollte korrekt sein, da er aus einem Beispiel über CLP in Prolog stammt. Was mache ich falsch/was muss ich ändern, damit das Programm läuft ?!

Ich sehe das doch richtig, dass man die Bibliothek über den Befehl benutzt und das auch in das Programm schreibt ?! Wie ist das mit der Klammerung; müssen Constraints in {} Klammern ? In der SWI Dokumentation steht dies zwar, angeblich sei aber auch das weglassen der Klammerung äquivalent…naja eigentlich habe ich auch alles ausprobiert, library erst später laden, Klammerung, Abtrennung der Constraints durch „;“ usw…sehr populär bei meinen Versuchen ist unter anderem der Fehler: Undefined procedure: {}/1

Ihr seht, ich bin verwirrt, vor allem da ich keine vernünftigen lauffähigen Beispiele finde und wäre somit für jede Art von Hilfe sehr dankbar!

Ich hoffe mal, dass hier Leute sind, die sich mit der Thematik auskennen :smile:

Beste Grüße,

derSlim

Hallo,

ich muss eine Ausarbeitung über Constraint Logic Programming
schreiben. Ich habe mich erstmal ein bisschen eingelesen und
danach versucht, kleine Beispielprogramme in SWI Prolog zu

Ein Beispiel, die Fibonacci Zahlen:

use_module(library(clpr)).
fib(0,1).
fib(1,1).
fib(N,R1+R2):- N>1,
fib(N-1,R1),
fib(N-2,R2).

ok ich seh du hast schon in anderen foren einiges zu derselben frage.

Also hier hab ich ein besipiel gefunden
http://www.informatik.uni-kiel.de/~npr/fopro/skript.pdf

das sollte funktionieren was einbinden angeht etc, wird ja beschrieben, versuchs doch mal, vielleicht erleuchtet dich das ja :smile: was das einbinden der module eingeht :smile:

Hallo,

ja das Dokument habe ich mir auch schon durchgelesen. Das Beispiel zur Ohmschen Berechnung funktioniert auch:

  • use_module(library(clpr)).

% OHMsches Gesetz
sk(wider®,V,I) :- {V = I * R}.
% KIRCHHOFFsche Gesetze
sk(reihe(S1,S2),V,I) :-
{I = I1, I = I2, V = V1 + V2},
sk(S1,V1,I1),
sk(S2,V2,I2).
sk(parallel(S1,S2),V,I) :-
{I = I1 + I2, V = V1, V = V2},
sk(S1,V1,I1),
sk(S2,V2,I2).

1 ?- sk(reihe(wider(180),wider(470)), 5, I).
I = 0.00769231.

Wenn ich das ganze jetzt aber komplett analog zu meinem fib-Beispiel mache, sollte das doch so aussehen:

  • use_module(library(clpr)).

fib(0,1).
fib(1,1).
fib(N,R1+R2):- {N>1},
fib(N-1,R1),
fib(N-2,R2).

Das Modul wird mit :- use_module(library(clpr)). geladen. Wenn ich compiliere passiert das auch: library(clpr) compiled into clpr 0.17 sec, 602,968 bytes
Das Constraint wird in geschweifte Klammern gesetzt…

Das funktioniert aber nicht:

1 ?- fib(10,N).
false.

Das ist ja genau meine Frage, ich weiss eigentlich was ich machen sollte (zumindest denke ich das), aber trotzdem will das Dingen einfach nicht funktionieren…und ich komme einfach nicht darauf, wo der Fehler liegt…genau da hoffe ich auf Hilfe :smile:

Also ich muss mich hier nochmal melden. Es wird immer verrückter und ich so langsam auch…

Ich habe ein Programm gefunden, was compiliert und auch wunderbar funktioniert.

  • use_module(library(clpr)).

darlehen(Darlehenshoehe,Monate,Zinssatz,Rate,Restschuld):-
{Monate=0},Darlehenshoehe=Restschuld.

darlehen(Darlehens,Monate,Zinssatz,Rate,Restschuld):-
{Monate>0,
Monate1=Monate-1,
Darlehens1=Darlehens+Darlehens*Zinssatz-Rate},
darlehen(Darlehens1,Monate1,Zinssatz,Rate,Restschuld).

Man kann damit Zinseszinsrechnung betreiben.

Nachdem ich glücklich festgestellt habe, dass das Programm funktioniert hat es bei mir geklingelt: Ich hatte vor ein paar Tagen versucht, ein fast gleiches Programm zum laufen zu bringen, was aber nicht funktioniert hat. Also hab ich es nochmal raus gesucht und jetzt kommts:

Das Programm ist bis auf andere Variablenbenennungen exakt dasselbe!!

Wahnsinn hab ich mir gedacht, aber dachte auch vielleicht ist das ja gut und ich übersehe nur eine klitzekleine Änderung die mich darauf bringt, woran ich die ganze Zeit scheitere. Also habe ich mich daran gemacht, Stücke zu löschen und den Code exakt anzugleichen. Ich habe so viel gelöscht, dass die Funktionalität komplett weg ist, aber das eigentliche ist:

Ich habe jetzt 2 Programme die identisch sind, IDENTISCH:

Programm1:

  • use_module(library(clpr)).

darlehen(Darlehenshoehe,Monate,Zinssatz,Rate,Restschuld):-
{Monate=0},Darlehenshoehe=Restschuld.

Programm2:

  • use_module(library(clpr)).

darlehen(Darlehenshoehe,Monate,Zinssatz,Rate,Restschuld):-
{Monate=0},Darlehenshoehe=Restschuld.

DAS EINE FUNKTIONIERT UND DAS ANDERE NICHT

Programm1:

% library(win_menu) compiled into win_menu 0.00 sec, 12,912 bytes
% library(swi_hooks) compiled into pce_swi_hooks 0.00 sec, 2,404 bytes
% library(clpr) compiled into clpr 0.17 sec, 602,968 bytes
ERROR: d:/uni/ss10/proseminar/clp/finanz2.pl:5:8: Syntax error: Operator expected
% d:/Uni/SS10/ProSeminar/CLP/finanz2.pl compiled 0.17 sec, 604,612 bytes

Programm2:

% library(win_menu) compiled into win_menu 0.00 sec, 12,912 bytes
% library(swi_hooks) compiled into pce_swi_hooks 0.00 sec, 2,404 bytes
% library(clpr) compiled into clpr 0.16 sec, 602,968 bytes
Warning: d:/uni/ss10/proseminar/clp/finanz3.pl:5:
Singleton variables: [Zinssatz,Rate]
% d:/Uni/SS10/ProSeminar/CLP/finanz3.pl compiled 0.16 sec, 604,400 bytes

Wie kann das sein ?! Glaubt mir, ich habe das Gefühl ich werde so langsam verrückt. Ich hab sogar schon angefangen im Code nach versteckten Leerzeichen zu suchen…also wenn irgendwer eine Idee hat, woran das liegen könnte, bitte sagt es mir :smile: