对于我的大学课程,我必须为已经设定的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的正则表达式部分工作,以便匹配字符串的开头/结尾?
感谢您的帮助:)
答案 0 :(得分:0)
您对findall
的使用本质上是错误的。
你得到了最后一个参数:结果。
第一个参数描述了结果项的形成方式。您无法在此使用X
,因为X
是您的搜索字符串并已定义。如果必须,请使用其他内容Z
。
第二个参数指定Z
必须实现的目标:它应该是文章的标题,并以X
开头。
因此,这应该有效:
findArticlesWith(X,Y) :-
findall(Z, (article(Z,_), string_concat(X,_,Z)), Y).
但尝试找到更好的变量名称。