Prolog - 正则表达式匹配
Prolog - regular expression matching
对于我的大学课程作业,我必须为已设置的 PROLOG 问题编写一些解决方案。他们为我们提供了一个庞大的 facts/predicates 数据库,其中是 lecturers/researchers 在大学发表的文章。其中一个问题要求我们获取所有以某个字符串开头的标题(他们评估我们时会告诉我们)。我不知道如何匹配谓词中的部分标题。
这里是谓词的一个例子:
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).
我希望它成为 return 标题列表,例如 Y = ['Title 1', 'Title 2'].
等。但是,它只是 return 一个空列表,我想是因为没有只有 'Title' 的标题,而是后面有一些东西。
如何让 Prolog 的正则表达式部分工作,以便它匹配字符串的 beginning/end?
感谢您的帮助:)
您对 findall
的用法本质上是错误的。
最后一个参数正确:结果。
第一个参数描述了结果项是如何形成的。您不能在此处使用 X
,因为 X
是您的搜索字符串并且已经定义。如果必须,请使用其他东西,Z
。
第二个参数指定Z
要实现的目标:应该是一篇文章的标题,以X
开头。
因此,这应该有效:
findArticlesWith(X,Y) :-
findall(Z, (article(Z,_), string_concat(X,_,Z)), Y).
但尝试找到更好的变量名。
对于我的大学课程作业,我必须为已设置的 PROLOG 问题编写一些解决方案。他们为我们提供了一个庞大的 facts/predicates 数据库,其中是 lecturers/researchers 在大学发表的文章。其中一个问题要求我们获取所有以某个字符串开头的标题(他们评估我们时会告诉我们)。我不知道如何匹配谓词中的部分标题。
这里是谓词的一个例子:
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).
我希望它成为 return 标题列表,例如 Y = ['Title 1', 'Title 2'].
等。但是,它只是 return 一个空列表,我想是因为没有只有 'Title' 的标题,而是后面有一些东西。
如何让 Prolog 的正则表达式部分工作,以便它匹配字符串的 beginning/end?
感谢您的帮助:)
您对 findall
的用法本质上是错误的。
最后一个参数正确:结果。
第一个参数描述了结果项是如何形成的。您不能在此处使用 X
,因为 X
是您的搜索字符串并且已经定义。如果必须,请使用其他东西,Z
。
第二个参数指定Z
要实现的目标:应该是一篇文章的标题,以X
开头。
因此,这应该有效:
findArticlesWith(X,Y) :-
findall(Z, (article(Z,_), string_concat(X,_,Z)), Y).
但尝试找到更好的变量名。