Prolog wildcard for completing a string

前端 未结 1 1249
感动是毒
感动是毒 2020-12-11 23:53

I am currently stuck on a prolog problem.

So far I have:

film(Title) :- movie(Title,_,_). (Where \'movie(T,_,_,)\' is a reference

相关标签:
1条回答
  • 2020-12-12 00:17

    It all depends how the title is represented.

    Atom

    If it is represented as an atom, you need sub_atom(Atom, Before, Length, After, Sub_atom)

    ?- Title = 'The Third Man', sub_atom(Title, 0, _, _, 'The').
    Title = 'The Third Man'.
    

    List of codes

    If it is a list of codes which is called a string in Prologs in Edinburgh tradition, you can either "hard code" it with append/3 or you might use Definite Clause Grammars for general patterns.

    ?- set_prolog_flag(double_quotes,codes).
    true.
    
    ?- append("The",_, Pattern), Title = "The Third Man", Pattern = Title.
    Pattern = Title, Title = [84, 104, 101, 32, 84, 104, 105, 114, 100|...].
    
    ?- Title = "The Third Man", phrase(("The",...), Title).
    Title = [84, 104, 101, 32, 84, 104, 105, 114, 100|...] ;
    false.
    

    Note that 84 is the character code of T etc.

    phrase/2 is "the entry" to grammars. See dcg for more. Above used the following definition:

    ... --> [] | [_], ... .
    

    List of characters

    Similar to list of codes, list of characters provide a more readable representation that has still the advantages of being compatible with list predicates and Definite Clause Grammars:

    ?- set_prolog_flag(double_quotes,chars).
    true.
    
    ?- append("The",_, Pattern), Title = "The Third Man", Pattern = Title.
    Pattern = Title, Title = ['T', h, e, ' ', 'T', h, i, r, d|...].
    
    ?- Title = "The Third Man", phrase(("The",...), Title).
    Title = ['T', h, e, ' ', 'T', h, i, r, d|...] ;
    false.
    

    See also this answer.

    0 讨论(0)
提交回复
热议问题