2017-12-06 6 views
-1

in ein solches Programm mit Bibliothek (real):können Prolog-Programme mit Bibliothek (real) relational gemacht werden?

:- use_module(library(real)). 
:- use_module(library(lists)). 
:- use_module(library(apply_macros)). 
:- use_module(library(readutil)). 

my_sum(L, S):- 
    i <- L, 
    <- i, 
    S <- sum(i). 

ist es eine Möglichkeit, das Programm zu ändern, um der Lage sein, sie rückwärts laufen zu lassen? Derzeit funktioniert dies:

?- my_sum([1,2,3],X). 
X = 6. 

Aber dies führt zu einer Ausnahme:

?- my_sum(L,2). 
ERROR: Arguments are not sufficiently instantiated 
ERROR: In: 
ERROR: [13] _6776=..[_6782|_6784] 
ERROR: [12] real:r_call(_6814,[rvar(i),...|_6832]) at /home/raoul/lib/swipl/pack/real/prolog/real.pl:1101 
ERROR: [8] my_sum(_6862++[...|_6870],2) at /home/raoul/Bureau/prolog_relational_stats/relational_R.pl:16 
ERROR: [7] <user> 
ERROR: 
ERROR: Note: some frames are missing due to last-call optimization. 
ERROR: Re-run your program in debug mode (:- debug.) to get more detail. 

Antwort

3

Von p. 4 von the manual:

Das < -/1 Prädikat sendet eine R Ausdruck, dargestellt als Masse Prolog Begriff, zu R, ohne auf irgendwelche Ergebnisse zurück an Prolog zu bekommen. Der < -/2 Operator erleichtert bidirektionale Kommunikation. Wenn die linke Seite eine freie Variable ist, nimmt die Bibliothek an, dass wir Daten von R an Prolog übergeben. Wenn die linke Seite gebunden ist, geht davon aus, dass wir Echtdaten vorbei oder Funktionsaufrufe an R.

So Ihr Code schlägt fehl, wenn L instanziierte wird.

Sie können die Fälle so handhaben:

my_sum(L,S) :- 
    (ground(L), var(S) -> 
    i <- L, <- i, S <- sum(i) 
    ; var(L), ground(S) -> 
    % your code here 
    ; % error? 
    ). 

Dann my_sum/2 kann in beiden Richtungen verwendet werden.

+0

Vielen Dank. Ich hatte verstanden, was das Problem war, aber nicht gut genug, um es zu lösen. Ich bin noch ein Anfänger in Prolog. – Raoul

Verwandte Themen