2011-11-25 16 views
39

Sono nuovo di Prolog e ho notato che "e" danno un comportamento diverso, ma sono curioso di sapere perché. In particolare, quando si carica un file, ?- ['test1.pl']. funziona, mentre ?- ["test1.pl"]. no.Qual è la differenza tra "e" in Prolog?

+1

In SWI-Prolog 7 e versioni successive, sia il lavoro e lo stesso significato. Come qualcuno sicuramente farà notare, questo non è un comportamento conforme a ISO-Prolog. E per favore, non accettare la risposta attualmente accettata perché non è corretta. –

+4

@Boris: con 'set_prolog_flag (double_quotes, atom)' entrambe le query sono le stesse dell'esempio di default in IF/Prolog. Anche SWI7 [può fare di meglio] (http://www.complang.tuwien.ac.at/ulrich/iso-prolog/SWI7_and_ISO#strings_less_non_conforming), anche se nel suo complesso SWI7 non è conforme. – false

risposta

32

Gli articoli singoli citati sono sempre atomi.

Il significato di virgolette doppie dipende dalla bandierina Prolog double_quotes:


atom — con questo valore "a" = a. Al giorno d'oggi, questo è usato raramente. Ma troverai i libri Prolog in cui è scritto ["abc.pl"].


codes — un elenco di codici di carattere. Questo è spesso il default, ma si porta a risposte molto illeggibili come

 
?- set_prolog_flag(double_quotes,codes). 
true. 

?- phrase(("Ja tvoi ",("sluga"|"rabotnik"),"!"), Satz). 
Satz = [74,97,32,116,118,111,105,32,115,108,117,103,97,33] ; 
Satz = [74,97,32,116,118,111,105,32,114,97,98,111,116,110,105,107,33]. 

Ancora peggio, se si utilizzano i caratteri al di là di ASCII:

 
?- phrase(("Я твой ",("слуга"|"работник"),"!"), Satz). 
Satz = [1071,32,1090,1074,1086,1081,32,1089,1083,1091,1075,1072,33] ; 
Satz = [1071,32,1090,1074,1086,1081,32,1088,1072,1073,1086,1090,1085,1080,1082,33]. 

chars — un elenco di uno -carici di carbone. See this per ulteriori informazioni.

 
?- set_prolog_flag(double_quotes,chars). 
true. 

?- phrase(("Ja tvoi ",("sluga"|"rabotnik"),"!"), Satz). 
Satz = ['J',a,' ',t,v,o,i,' ',s,l,u,g,a,!] ; 
Satz = ['J',a,' ',t,v,o,i,' ',r,a,b,o,t,n,i,k,!]. 

?- phrase(("Я твой ",("слуга"|"работник"),"!"), Satz). 
Satz = ['Я',' ',т,в,о,й,' ',с,л,у,г,а,!] ; 
Satz = ['Я',' ',т,в,о,й,' ',р,а,б,о,т,н,и,к,!]. 

Questa notazione fornisce risposte più leggibili. Può essere visualizzato in modo ancora più compatto poiché la notazione a virgolette doppie può essere utilizzata per stampare qualsiasi elenco di atomi a un carattere. C'è library(double_quotes) per SICStus e SWI.

 
?- use_module(library(double_quotes)). 
true. 

?- phrase(("Ja tvoi ",("sluga"|"rabotnik"),"!"), Satz). 
Satz = "Ja tvoi sluga!" ; 
Satz = "Ja tvoi rabotnik!". 

?- phrase(("Я твой ",("слуга"|"работник"),"!"), Satz). 
Satz = "Я твой слуга!" ; 
Satz = "Я твой работник!". 

Se avete difficoltà nell'installazione double_quotes.pl come una libreria, è sufficiente mettere nella directory di altri file Prolog e dire: use_module(double_quotes).

+1

Grazie per aver ampliato la risposta sopra. – astay13

+7

@ astay13 Questa risposta è corretta, mentre l'altra no. Non "si espande" sull'altra risposta. –

12

Le stringhe in Prolog sono scritte tra virgolette singole. I termini scritti tra virgolette vengono immediatamente convertiti in un elenco di codici carattere.

?- write('sdf'). 
sdf 
true. 

?- write("sdf"). 
[115, 100, 102] 
true. 
+1

[domanda correlata] (http://stackoverflow.com/questions/4391435/how-to-manipulate-strings-in-prolog) – CamilleLDN

+10

* Gli atomi * in Prolog sono racchiusi tra virgolette singole. – Thilo

+15

Forse una qualifica minore: gli atomi sono di solito solo annotati. Solo se altrimenti sarebbero scambiati per qualcos'altro (come per esempio una variabile) li racchiudi tra virgolette singole. Puoi opzionalmente farlo in ogni caso, solo che è inutile. – mat

Problemi correlati