Niezależnie od systemu Prolog używasz i chyba trzeba utrzymania istniejącego kodu, trzymać się set_prolog_flag(double_quotes, chars)
. Działa to w postaci many systems , takich jak B, GNU, IF, IV, Minerva, SICStus, SWI, YAP. Więc jest to bezpieczny zakład . Inne opcje wymienione przez @Boris są trudne do debugowania. Jeden jest nawet specyficzny tylko dla SWI .
?- set_prolog_flag(double_quotes, chars).
true.
?- L = "abc".
L = [a, b, c].
Z library(double_quotes)
te łańcuchy mogą być drukowane bardziej zwarty.
W SWI, najlepiej można zrobić, to umieścić w swoim .swiplrc
liniach:
:- set_prolog_flag(back_quotes, string).
:- set_prolog_flag(double_quotes, chars).
:- use_module(library(double_quotes)).
Dla Państwa konkretny przykład, to jest dobry pomysł, aby uniknąć wytwarzania skutki uboczne natychmiast. Zamiast rozważać definiowania relacji między słowem i pisowni:
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".
I tu jest oryginalna definicja. W większości przypadków jednak należy trzymać się jego czystego rdzenia.
spellWord(Ws) :-
word_spelling(Ws, Xs),
format("~s", [Xs]).
Należy również pamiętać, że SWI wbudowanej library(pio)
działa tylko dla kodów i pozostawia niepotrzebne dotyczącej wyboru punktów otwarte. Zamiast tego użyj this replacement , która działa dla chars
i codes
w zależności od flagi Prolog.
Historycznie znaki były najpierw reprezentowane jako atomy o długości . Oznacza to, że w 1972 w Prologu 0, łańcuchy były reprezentowane w sposób lewostronny, co ułatwiło dopasowanie sufiksu.
plur(nil-c-i-e-l, nil-c-i-e-u-x).
Począwszy Prolog I, 1973, cudzysłowy oznaczało listę znaków jak dzisiaj.
W 1977 roku, DECsystem 10 Prolog zmienił znaczenie podwójnych cytatów do list kodów znaków i używanych kodów w miejsce znaków. To sprawiło, że niektóre operacje we/wy były nieco bardziej wydajne, ale sprawiły, że debugowanie takich programów było o wiele trudniejsze [76,105,107,101,32,116,104,105,115] - czy możesz je przeczytać?
ISO Prolog obsługuje oba. Jest flaga double_quotes
, którą oznacza how double quotes are interpreted.Również charakter związane Zabudowy są obecni zarówno:
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
Jak mogę to zrobić, aby zaakceptować dane wejściowe w pojedynczym cudzysłowie, takie jak "ciasto" – donsavage
@donsavage Wystarczy użyć odpowiedniego predykatu konwersji w pierwszej kolejności. Wymieniłem je w powyższej odpowiedzi. –
Istnieje również opcja 'set_prolog_flag (double_quotes, chars)' – false