2017-09-19 4 views
1

Disons que j'ai un fichier main.pl avec le contenu suivantswi-prolog ne peut pas inclure de fichier externe?

/* I tried these one at a time, not all at once... */ 
[externalFile]. 
['externalFile']. 
['externalFile.pl']. 
['./externalFile.pl']./*this was an answer to a similar SO question*/ 
consult(externalFile). 
/*... etc ...*/ 

permet maintenant l'utiliser ...

$ swipl -l externalFile.pl 
/* 12 second loading delay */ 
/* everything works perfect! */ 
$ swipl -l main.pl 
/* 0 second loading delay */ 
/* let's try anything from externalFile... */ 
ERROR: toplevel: Undefined procedure: [...] 
/* main.pl might as well be empty */ 
?- consult(externalFile). 
/* 0 second loading delay */ 
true. 
/* true? oh my bad! Lets try again... */ 
ERROR: toplevel: Undefined procedure: [...] 
?- [externalFile]. 
/* 12 second loading delay... seems better... */ 
true. 
/* been lied to before... */ 
/* and yet every thing works perfect now! */ 

Note: consult(externalFile). n'a qu'à aucun effet lorsque consult(externalFile). est en main.pl. Sinon, consult(externalFile). parvient à importer le fichier dans une session de terminal. Comment puis-je écrire du code source sans avoir à copier et coller tout mon programme dans le terminal (ou juste avoir tout mon code source de programme a une taille de fichier de 15+ MEGA octets d'inclusions manuelles!) Si le terminal est le seul endroit où les commandes d'importation fonctionneront?


Note: J'ai également vérifié le codage de ligne de séparation (DOS vs Windows) (ce qui était la réponse à une autre question)

Note: clauses indépendantes définies directement dans main.pl fonctionner correctement

+1

Voir: http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse52 –

+2

Vous devriez consulter la documentation de Prolog. '[]' dans ce contexte est identique à 'consulter()'. Ce sont des directives. Les directives exigent ': -'. Ainsi, par exemple, ': - [externalFile] .' ou': - consult (externalFile) .'. – lurker

+1

@lurker pourquoi ne pas écrire comme une réponse, semble assez complète et très utile :)? – coder

Répondre

2

Les opérations telles que consult sont référencées dans Prolog sous la forme directives. Prolog Les directives sont reconnues différemment par Prolog selon que vous utilisez l'environnement interactif ou que vous exécutez une directive à partir d'un fichier source Prolog.

Dans l'environnement interactif, une directive est tapés à l'invite ?-:

?- consult('myfile'). 

Lorsque vous consultez un fichier, Prolog voit le fichier comme une série d'affirmations des faits et des règles. Toutefois, si Prolog voit l'opérateur :-, il traite la ligne comme une directive dans le fichier. Donc, à partir d'un fichier, vous devez utiliser cet opérateur:

:- consult('myfile'). 

Les supports [] sont une sorte de main courte pour consult(). Vous donnez à Prolog une liste de fichiers à consulter. Ce qui précède équivaudrait à:

?- [myfile]. 

Et

:- [myfile]. 

Il y a aussi différentes formes qui sont acceptables. Un argument consult doit être un atome. Si vous avez un fichier appelé myfile.pl, il peut être consulté:

:- [myfile]. 
:- ['myfile']. 
:- ['myfile.pl']. 

Et de même:

:- consult(myfile). 
:- consult('myfile'). 
:- consult('myfile.pl'). 

consult(myfile.pl) ou [myfile.pl] se traduira par une erreur depuis le, sans les guillemets, myfile.pl ne seront pas vu comme un seul atome.

La liste ([]) sous forme de consulter accepte plusieurs fichiers:

:- [myfile, anotherfile]. 

Pour répondre à votre commentaire:

consult(externalFile). n'a que aucun effet lorsque consult(externalFile). est en main.pl.

Lorsque vous mettez consult(externalFile). sur une ligne par lui-même dans un fichier (comme main.pl) que vous consultiez, vous dites Prolog que vous souhaitez faire valoir le terme (fait dans ce cas), consult(externalFile) qui consiste foncteur consult et a un argument atomique, externalFile. Donc en fait fait faire quelque chose, mais pas ce que vous attendiez.