Prolog getting head and tail of string

后端 未结 3 1406
情话喂你
情话喂你 2020-12-11 03:47

I\'m trying to wrap my brain around Prolog for the first time (SWI-Prolog) and I\'m struggling with what I\'m sure are the basics. I\'m trying to take a string such as \"pie

3条回答
  •  臣服心动
    2020-12-11 04:40

    Regardless of the Prolog system you are using and unless you have to maintain existing code, stick to set_prolog_flag(double_quotes, chars). This works in many systems like B, GNU, IF, IV, Minerva, SICStus, SWI, YAP. So it is a safe bet. The other options mentioned by @Boris are hard to debug. One is even specific to SWI only.

    ?- set_prolog_flag(double_quotes, chars).
    true.
    
    ?- L = "abc".
    L = [a, b, c].
    

    With library(double_quotes) these strings can be printed more compactly.

    In SWI, the best you can do is to put in your .swiplrc the lines:

    :- set_prolog_flag(back_quotes, string).
    :- set_prolog_flag(double_quotes, chars).
    :- use_module(library(double_quotes)).
    

    For your concrete example, it is a good idea to avoid producing side-effects immediately. Instead consider defining a relation between a word and the spelling:

    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".
    

    And here is your original definition. Most of the time, however, rather stick with the pure core of it.

    spellWord(Ws) :-
       word_spelling(Ws, Xs),
       format("~s", [Xs]).
    

    Also note that SWI's built-in library(pio) only works for codes and leaves unnecessary choice-points open. Instead, use this replacement which works for chars and codes depending on the Prolog flag.

    Historically, characters were first represented as atoms of length one. That is, 1972 in Prolog 0. However, there, strings were represented in a left-associative manner which facilitated suffix matching.

    plur(nil-c-i-e-l, nil-c-i-e-u-x).
    

    Starting with Prolog I, 1973, double quotes meant a list of characters like today.

    In 1977, DECsystem 10 Prolog changed the meaning of double quotes to lists of characters codes and used codes in place of chars. This made some I/O operations a little bit more efficient, but made debugging such programs much more difficult [76,105,107,101,32,116,104,105,115] - can you read it?

    ISO Prolog supports both. There is a flag double_quotes that indicates how double quotes are interpreted. Also, character related built-ins are present for both:

    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
    

提交回复
热议问题