用于完成字符串的 Prolog 通配符

3 prolog

我目前陷入了序言问题。

到目前为止我有:

film(Title) :- movie(Title,_,_). (其中“ movie(T,_,_,)”是对我的数据库的引用)

namesearch(Title, Firstword) :- film(Title), contains_term(Firstword, Title).
Run Code Online (Sandbox Code Playgroud)

很难解释我需要什么帮助,但基本上有一个通配符我可以用来搜索以特定单词开头的所有电影,例如,如果我要搜索以单词“The”开头的所有电影。

是否有一个通配符可以让我这样输入:namesearch(X,'The*')

我尝试过像这样使用星号,但它不起作用,

感谢您的帮助

fal*_*lse 5

这完全取决于标题的表示方式。

原子

如果它表示为原子,则需要sub_atom(Atom, Before, Length, After, Sub_atom)

?- Title = 'The Third Man', sub_atom(Title, 0, _, _, 'The').
   Title = 'The Third Man'.
Run Code Online (Sandbox Code Playgroud)

代码列表

如果它是一个代码列表,在爱丁堡传统的 Prolog 中称为字符串,您可以使用它“硬编码” append/3,也可以使用定子句语法来表示一般模式。

?- 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.
Run Code Online (Sandbox Code Playgroud)

注意84是T等的字符代码。

phrase/2是语法的“入门”。更多信息请参见上面使用了以下定义:

... --> [] | [_], ... .
Run Code Online (Sandbox Code Playgroud)

字符列表

与代码列表类似,字符列表提供了一种更易读的表示形式,并且仍然具有与列表谓词和定语从句语法兼容的优点:

?- 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.
Run Code Online (Sandbox Code Playgroud)

另请参阅此答案