如何在Prolog中实现spent(Passengers, Year, Sum)谓词?
解决Prolog中spent谓词的实现问题
首先明确需求:实现spent(Year, Passengers, Total)谓词,计算指定Year内,Passengers列表中所有乘客的机票总费用。
核心思路
- 通过机票ID关联
ticket和trip事实,获取对应机票价格 - 过滤出指定年份的机票记录
- 筛选出目标乘客列表中的乘客记录
- 累加符合条件的机票价格得到总费用
完整实现代码
% 现有事实 trip(01, Tokio, Toronto, 1500). % trip(Id, From, To, Price) trip(02, California, London, 700). ticket(01, Sara, 2021-12-26). % ticket(Id, Passenger, Date) ticket(02, Jane, 2021-05-21). % 目标谓词:计算指定年份、指定乘客列表的总机票费用 spent(Year, Passengers, Total) :- % 收集所有符合条件的机票价格 findall(Price, (member(Passenger, Passengers), % 遍历乘客列表 ticket(TripId, Passenger, Year-_-_), % 匹配指定年份的机票 trip(TripId, _, _, Price)), % 关联对应行程的价格 PriceList), sum_list(PriceList, Total). % 累加价格列表得到总费用
测试示例
比如计算2021年[Sara, Jane]的总费用:
?- spent(2021, [Sara, Jane], Total). Total = 2200.
补充说明
Year-_-_是Prolog的复合项匹配,用来提取日期中的年份,忽略月和日部分findall/3用于收集所有符合条件的价格到列表中- 若你的Prolog环境没有内置
sum_list/2求和谓词,可自行实现:
sum_list([], 0). sum_list([H|T], Sum) :- sum_list(T, Rest), Sum is H + Rest.
内容的提问来源于stack exchange,提问作者Mashka
相关产品推荐
相关产品推荐

