如何用Prolog编写规则查询同年开播的剧集配对?
Prolog实现同开播年份剧集查询的解决方案
问题原因
你当前定义的same_year/1规则仅做了存在性校验,没有设置参数承载剧集返回值,因此查询时仅会返回布尔结果,无法输出匹配的剧集内容。
正确实现方案
1. 基础事实(你已定义)
show( seinfeld , 1989 , 8.9 ). show( twin_peaks , 1990 , 8.9 ). show( the_xfiles , 1993 , 8.7 ).
2. 单年份对应单剧集查询规则
如果你需要查询指定年份下的所有剧集(Prolog会逐一枚举返回),定义双参数规则即可:
same_year_show(Year, Show) :- show(Show, Year, _). % 下划线表示忽略评分参数
查询示例:
输入查询same_year_show(1989, Show).,Prolog会返回Show = seinfeld,如果有多个匹配结果会逐个返回。
3. 一次性获取指定年份的所有剧集列表
如果需要直接返回列表形式的所有匹配结果,可以配合Prolog内置的findall谓词查询,不需要额外定义规则:
查询示例:
输入findall(Show, show(Show, 1989, _), ShowList).,会直接返回ShowList = [seinfeld]。
4. 同年份剧集配对查询规则
如果你需要得到开播年份相同的两两剧集对(避免重复配对、避免同一剧集和自身配对),可以用如下规则:
same_year_pair(Year, ShowA, ShowB) :- show(ShowA, Year, _), show(ShowB, Year, _), ShowA @< ShowB. % 按字典序比较避免重复配对
查询示例:
输入查询same_year_pair(Year, S1, S2).,会枚举所有符合条件的同年份剧集对。
内容的提问来源于stack exchange,提问作者Chuzzz
相关产品推荐
相关产品推荐

