You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Prolog中实现spent(Passengers, Year, Sum)谓词?

解决Prolog中spent谓词的实现问题

首先明确需求:实现spent(Year, Passengers, Total)谓词,计算指定Year内,Passengers列表中所有乘客的机票总费用。

核心思路

  1. 通过机票ID关联ticket和trip事实,获取对应机票价格
  2. 过滤出指定年份的机票记录
  3. 筛选出目标乘客列表中的乘客记录
  4. 累加符合条件的机票价格得到总费用

完整实现代码

% 现有事实
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:10:34