2017-10-31 4 views
0

Bei der Erstellung und den nachfolgenden Code ausgeführt wird (pl_check_input.pl), erhalte ich "user directive failed" auf der ": - Initialisierung ..." lineGnu-prolog - Initialisierung Prädikat Fehler

:- dynamic(doit/0). 
:- initialization(doit). 
:- include(head). 

doit :- 
    readFB(user_input), 
    writeFB, 
    halt. 

:- include(tail). 

$ gplc --no-del-temp --no-top-level pl_check_input.pl 
$ ./pl_check_input <fb1 >fb2 
warning: /home/tarvydas/Dropbox/Projects/vsh/pl-vsh/pl_check_input.pl:2: user directive failed 

Wenn ich entfernen Sie die Codezeile

:- dynamic(doit/0). 
:- include(head). 

doit :- 
    readFB(user_input), 
    writeFB, 
halt. 

:- include(tail). 

$ gplc --no-del-temp --no-top-level pl_check_input.pl 
$ ./pl_check_input <fb1 >fb2 
Warning: no initial goal executed 
    use a directive :- initialization(Goal) 
    or remove the link option --no-top-level (or --min-bips or --min-size) 

Alle Einsichten wären sehr willkommen.

Letztendlich habe ich diesen Code von der REPL ausgeführt, aber ich möchte es in ein Linux-Pipeline-Skript einfügen und entfernen Sie die verschiedenen Banner-Zeilen, die mit Top-Level/0 kommen.

+0

(dynamic/Initialisierungs/include sind auf separaten Leitungen) –

+0

[MCVE] (/ help/MCVE), Bitte. – false

Antwort

0

"egal", es stellte sich heraus, dass es sich um eine fehlende Regel handelte, die eine sehr irreführende Fehlermeldung erzeugte. Um den Fehler zu duplizieren, erstellen junk.pl:

:- initialization(main). 
:- include(head). 

main :- 
    readFB(user_input), 
    writeFB, 
    halt. 

:- include(tail). 

und erstellen Datei head.pl:

:- dynamic(component/1) . 
:- dynamic(edge/1) . 

erstellen Datei tail.pl (die erste Zeile auf Kommentar ist die fehlende Regel)

% writeterm(Term) :- current_output(Out), write_term(Out, Term, []), write(Out, '.'), nl. 


writeFB :- 
    forall(component(X), writeterm(component(X))), 
    forall(edge(X), writeterm(edge(X))). 

readFB(Str) :- 
    read_term(Str,T0,[]), 
    element(T0,Str). 

element(end_of_file, _) :- !. 
element(component(X), Str) :- !, 
       asserta(component(X)), 
       readFB(Str). 
element(edge(X), Str) :- !, 
       asserta(edge(X)), 
       readFB(Str). 

erstellen Datei fb1a:

component('pl_vsh') . 
edge(e0) . 

dann einen Compiler laufen und den Befehl:

$ gplc junk.pl --no-top-level 
$ ./junk <fb1a >fb2 

, die in der Fehlermeldung führt:

warning: /home/xxx/xxx/xxx/xxx/xxx/junk.pl:1: user directive failed