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

Prolog wildcard for completing a string

我目前遇到了序言问题。

到目前为止我有:

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

namesearch(Title, Firstword) :- film(Title), contains_term(Firstword, Title).

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

是否有允许我这样输入的通配符:namesearch(X,'The*') ?

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

感谢您的帮助

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

原子

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

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

代码列表

如果它是一个代码列表,在爱丁堡传统的 Prologs 中称为字符串,您可以 "hard code" 它与 append/3 或者您可以使用 Definite Clause Grammars 作为一般模式。

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

注意84是T等的字符编码

phrase/2 是 "the entry" 语法。有关更多信息,请参阅 。上面使用了以下定义:

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

字符列表

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

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

另见 this answer