2011-01-19 4 views
2

un script fonctionne avec succès par SWI-Prolog 5.11.11 sur système Linux, mais pas aussi bien sur les fenêtres système par Swi-Prolog 5.6.48Écrire dans le fichier | Swi-Prolog | Windows

main :- 
    open('output.txt',write,OS), 
    elements(Points), 
    get_set(Eq, Points), 
    alpha_isotone(Eq, Points), 
    write(OS,Eq),nl(OS), 
    false, 
    close(OS). 

Problème - sous les fenêtres fichier sortie .txt est vide et toutes les informations restent dans le pseudo-terminal. Sous Linux, cela fonctionne bien, mais la fin du fichier est souvent manquée. Comme

>> tail output.txt  
[6,1,3,6,6,6] 
[6,1,6,6,6,6] 
[6,3,1,6,6,6] 
[6,3,3,6,3,6] 
[6,3,3,6,5,6] 
[6,3,3,6,6,6] 
[6,3,6,6,6,6] 
[6,6,1,6,6,6] 
[6,6,3,6,6,6] 
[6,6,6, 

Qu'est-ce que je fais mal? (à l'exception de mon anglais)

+2

Comme écrit, la fermeture (OS) ne peut pas être atteinte; l'objectif ** main/0 ** échoue juste avant de l'atteindre. La fermeture (OS) ne devrait-elle pas être faite dans une clause alternative? – hardmath

Répondre

3

Si l'on voulait garder la fermeture (OS) dans un "simple" principale/0 clause, cela fonctionne aussi:

main :- 
    open('output.txt',write,OS), 
    ( elements(Points), 
     get_set(Eq, Points), 
     alpha_isotone(Eq, Points), 
     write(OS,Eq),nl(OS), 
     false 
     ; 
     close(OS) 
    ). 

Cette syntaxe n'est pas recommandée car il est difficile de se rappeler quelle est la préséance de la conjonction , par rapport à la disjonction ; sauf si vous utilisez fréquemment ce type de codage, et c'est sur ce compte moins lisible que la version présentée par larsmans.

Prolog définit la priorité relative des opérateurs, même pour ET, OU, et « cou » :-, en attribuant précédence valeurs à chaque (utilisateurs font avec op/3 lors de la définition de leurs propres opérateurs), allant De 0 à 1200.

Il y a également une inversion de the usual convention ici, en ce sens que nous entendons normalement que l'opérateur de priorité supérieure doit être appliqué avant les opérateurs de priorité inférieure. Mais dans Prolog the lower Precedence value indique un opérateur se lie (est appliqué) en premier.

valeurs réelles varient priorité à la mise en œuvre, mais conjointement , a inférieur valeur que précédence ; et se fixe disjunction ainsi d'abord.

2

Je suppose que cela devait être une boucle entraînée par une panne. Cela ne fonctionne pas car l'appel close/1, comme le dit @hardmath, n'est jamais atteint puisqu'il est précédé d'un fail/1 dans la même clause. En effet, le fichier de sortie n'est apparemment pas vidé. Cette boucle guidé par échecs doit être écrit:

main :- 
    open('output.txt', write, OS), 
    main(OS). 

main(OS) :- 
    elements(Points), 
    get_set(Eq, Points), 
    alpha_isotone(Eq, Points), 
    write(OS,Eq), nl(OS), 
    false. 
main(OS) :- close(OS). 
+0

Les différents effets sur les fichiers incorrectement fermés, Linux vs Windows, sont probablement dus à des stratégies de tamponnage différentes. Apparemment, à la fin du programme, Windows ferme le fichier sans jamais vider un tampon d'écriture, produisant ainsi un fichier vide. Linux est plus robuste, mais comme vous l'avez vu, la fin du programme peut perdre quelques caractères. – hardmath

+0

@hardmath: cela peut même ne pas être une question de «robustesse», mais juste une taille de tampon différente entre les systèmes d'exploitation. –