Lire un fichier ligne par ligne en Prolog
Je voudrais lire un fichier texte et d'appliquer un prédicat à chaque ligne (les prédicats contenir write
qui ne de la sortie). Comment dois-je procéder?
OriginalL'auteur Igor Marvinsky | 2011-01-26
Vous devez vous connecter pour publier un commentaire.
En SWI-Prolog, la solution la plus propre est d'écrire un DCG qui explique ce qu'est une "ligne" est, puis appelez un prédicat pour chaque ligne. Utilisation de la bibliothèque(pio) pour appliquer le DCG à un fichier.
MODIFIER: Comme demandé, pensez à:
Exemple d'utilisation:
?- phrase_from_file(lines(Ls), 'your_file.txt').
J'ai ajouté un exemple qui, je l'espère fonctionne le mieux pour vous.
Merci beaucoup! Je vois mon erreur avant de a été à l'aide de l'exemple dans le SWI-Prolog bibliothèque(pio) de la documentation pour mon modèle. Il utilise
findall/3
pour obtenir toutes les instances d'un certain modèle, mais je vois que vous venez d'utiliser un dcg qui analyse l'ensemble du fichier. Par curiosité, pourquoi devons-nous utilisercall(eos)
au lieu d'un dcg règle?call//1
(et puis,eos/2
) est utilisé de façon portable reportez-vous à la implicite DCG arguments de l'intérieur d'un DCG règle. Vous ne pouvez pas utiliser un DCG règle au lieu de cela, car DCG règles sont soumises à des règles de traduction qui leur permettent de faire référence uniquement à certaines parties de ces arguments. "Portable" signifie que c'est indépendant de la façon dont tout particulier Prologue en fait, le régime se traduit par DCG règles Prolog règles, de sorte qu'il fonctionne sur tous les systèmes qui prennent en charge DCGs comme actuellement en cours d'élaboration par l'ISO.Merci encore! J'ai retravaillé le problème que j'ai tenter avec l'aide de votre exemple, et il a fini dans un assez élégant. Plus important encore, vous avez contribué à me remonter ma compréhension de DCGs au niveau suivant. (J'ai étudié avec désinvolture, pour plus d'un an, et je me sens encore comme je l'ai limité à saisir. C'est un concept tellement simple, et pourtant... c'est peut-être pas si simple?).
OriginalL'auteur mat
Vous pouvez utiliser
read
pour lire le flux. N'oubliez pas de les invoquerat_end_of_stream
pour garantir l'absence d'erreurs de syntaxe.Exemple:
readFile.pl
myFile.txt
Ainsi, en invoquant
main
vous recevrez la sortie:Il suffit de configurer
main
. La sortie voici un exemple en utilisantwrite
, bien sûr. Configurer pour correspondre à votre demande.Je suppose que ce principe peut être appliqué pour répondre à votre question. Bonne chance.
OriginalL'auteur Ishq