Prolog - 正则表达式匹配

时间:2015-01-07 13:50:22

标签: regex prolog

对于我的大学课程,我必须为已经设定的PROLOG问题编写一些解决方案。他们为我们提供了一个庞大的事实/谓词数据库,这些数据库是大学讲师/研究人员发表的文章。其中一个问题要求我们获取所有以某个字符串开头的标题(当他们评估我们时会告诉我们)。我无法弄清楚如何匹配谓词中的部分标题。

以下是谓词的示例:

article('Title 1', 'author1').
article('Title 2', 'author1'). 
article('Title 3', 'author1').
article('Title 4', 'author1').
article('Title 5', 'author2').
article('Title 6', 'author2').

到目前为止我尝试过的代码:

findArticlesWith(X,Y) :-
    findall(X,article(match(X,Y),_),Y).

如您所见,输入将是要匹配的字符串,然后是列表的自由变量Y。我试图匹配以该字符串开头的所有标题,并将它们放在列表Y中。如果我查询findArticlesWith('Title',Y).我希望它返回标题列表,例如Y = ['Title 1', 'Title 2'].等。但是,它只返回一个空列表,我假设因为没有标题只有'标题'而是在它之后有一些东西。

如何让Prolog的正则表达式部分工作,以便匹配字符串的开头/结尾?

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

您对findall的使用本质上是错误的。

你得到了最后一个参数:结果。

第一个参数描述了结果项的形成方式。您无法在此使用X,因为X是您的搜索字符串并已定义。如果必须,请使用其他内容Z

第二个参数指定Z必须实现的目标:它应该是文章的标题,并以X开头。

因此,这应该有效:

findArticlesWith(X,Y) :-
    findall(Z, (article(Z,_), string_concat(X,_,Z)), Y).

但尝试找到更好的变量名称。