Indipendentemente dal sistema Prolog in uso e se non si dispone di mantenere il codice esistente, attenersi a set_prolog_flag(double_quotes, chars)
. Funziona in many systems come B, GNU, IF, IV, Minerva, SICStus, SWI, YAP. Quindi è una scommessa sicura . Le altre opzioni menzionate da @ Boris sono difficili da eseguire. Uno è addirittura specifico solo per SWI .
?- set_prolog_flag(double_quotes, chars).
true.
?- L = "abc".
L = [a, b, c].
Con library(double_quotes)
queste stringhe possono essere stampati in modo più compatto.
Nel SWI, il meglio che puoi fare è di mettere nelle vostre .swiplrc
le righe:
:- set_prolog_flag(back_quotes, string).
:- set_prolog_flag(double_quotes, chars).
:- use_module(library(double_quotes)).
Per esempio concreto, è una buona idea per evitare di produrre immediatamente effetti collaterali. Invece considerare la definizione di una relazione tra una parola e l'ortografia:
word_spelling(Ws, Ys) :-
phrase(natospelling(Ws), Ys).
natospelling([]).
natospelling([C|Cs]) -->
{char_lower(C, L)},
nato(L),
"\n",
natospelling(Cs).
nato(p) --> "Papa".
nato(i) --> "India".
nato(e) --> "Echo".
char_lower(C, L) :-
char_type(L, to_lower(C)).
?- word_spelling("Pie",Xs).
Xs = "Papa\nIndia\nEcho\n".
?- word_spelling("Pie",Xs), format("~s",[Xs]).
Papa
India
Echo
Xs = "Papa\nIndia\nEcho\n".
E qui è la sua definizione originale. La maggior parte delle volte, tuttavia, si attaccano al nucleo puro di esso.
spellWord(Ws) :-
word_spelling(Ws, Xs),
format("~s", [Xs]).
Si noti inoltre che SWI di built-in library(pio)
funziona solo per i codici e lascia inutili scelta punti aperti. Utilizzare invece this replacement che funziona per chars
e codes
in base alla bandiera Prolog.
Storicamente, i caratteri erano rappresentati per la prima volta come atomi di lunghezza . Cioè, 1972 in Prolog 0. Tuttavia, lì, le stringhe erano rappresentate in un modo associativo sinistro che facilitava la corrispondenza del suffisso.
plur(nil-c-i-e-l, nil-c-i-e-u-x).
Partendo Prolog I, 1973, le doppie virgolette significava un elenco di caratteri come oggi.
Nel 1977, DECsystem 10 Prolog ha cambiato il significato delle virgolette in elenchi di codici di caratteri e codici usati al posto di caratteri. Ciò ha reso alcune operazioni I/O un po 'più efficienti, ma reso più difficile il debug di tali programmi [76,105,107,101,32,116,104,105,115] - puoi leggerlo?
ISO Prolog supporta entrambi. C'è una bandiera double_quotes
che indica how double quotes are interpreted.Inoltre, carattere relativi built-in sono presenti per entrambi:
char_code/2
atom_chars/2, number_chars/2, get_char/1/2, peek_char/1/2, put_char/1/2
atom_codes/2, number_codes/2, get_code/1/2, peek_code/1/2, put_code/1/2
Come farei questo lavoro per accettare l'input tra virgolette singole, ad esempio "pie" – donsavage
@donsavage Basta utilizzare prima il predicato di conversione appropriato. Li ho elencati nella risposta sopra. –
C'è anche l'opzione 'set_prolog_flag (double_quotes, chars)' – false