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

Prolog技术实现:关联县名与死亡数,找出死亡数最高的县

解决方案

核心问题在于你之前的代码把死亡数列表和县名事实分开维护,导致无法关联两者。直接从countyDeaths/2事实中提取并关联县名与死亡数,就能解决这个问题。以下是两种实用实现思路:

方法一:利用排序快速获取最值(简洁高效)

直接收集所有县的死亡数与县名对,通过排序后取首尾元素得到最大/最小值对应的县:

county(a).
county(b).

countyDeaths(a,45).
countyDeaths(b,0).
% 可扩展添加更多县数据,例如:
% countyDeaths(c,27).
% countyDeaths(d,19).

% 获取死亡数最多的县和对应数值
max_deaths(MaxCounty, MaxDeaths) :-
    findall((Deaths, County), countyDeaths(County, Deaths), Pairs),
    sort(Pairs, SortedPairs),  % 按死亡数升序排序,数字相同则按县名字母序
    last(SortedPairs, (MaxDeaths, MaxCounty)).

% 获取死亡数最少的县和对应数值
min_deaths(MinCounty, MinDeaths) :-
    findall((Deaths, County), countyDeaths(County, Deaths), Pairs),
    sort(Pairs, SortedPairs),
    nth0(0, SortedPairs, (MinDeaths, MinCounty)).  % 取排序后的第一个元素

start :- 
    max_deaths(MaxCounty, MaxDeaths),
    min_deaths(MinCounty, MinDeaths),
    show_results(MaxCounty, MaxDeaths, MinCounty, MinDeaths).

show_results(MaxC, MaxD, MinC, MinD) :-
    format('The county with the highest amount of deaths is county "~w" with a total of ~w deaths.~n', [MaxC, MaxD]),
    format('The county with the lowest amount of deaths is county "~w" with a total of ~w deaths.~n', [MinC, MinD]).

运行效果:

?- start.
The county with the highest amount of deaths is county "a" with a total of 45 deaths.
The county with the lowest amount of deaths is county "b" with a total of 0 deaths.
true.

方法二:处理多县同最值的情况(更健壮)

如果存在多个县死亡数相同且都是最值,这种方法会收集所有符合条件的县:

county(a).
county(b).
county(c).

countyDeaths(a,45).
countyDeaths(b,0).
countyDeaths(c,0).  % 添加一个与b死亡数相同的县

% 获取所有死亡数最多的县和对应数值
max_deaths(MaxCounties, MaxDeaths) :-
    findall(Deaths, countyDeaths(_, Deaths), AllDeaths),
    max_list(AllDeaths, MaxDeaths),  % 先找出最大死亡数
    findall(County, countyDeaths(County, MaxDeaths), MaxCounties).  % 收集所有对应县

% 获取所有死亡数最少的县和对应数值
min_deaths(MinCounties, MinDeaths) :-
    findall(Deaths, countyDeaths(_, Deaths), AllDeaths),
    min_list(AllDeaths, MinDeaths),
    findall(County, countyDeaths(County, MinDeaths), MinCounties).

start :- 
    max_deaths(MaxCounties, MaxDeaths),
    min_deaths(MinCounties, MinDeaths),
    show_results(MaxCounties, MaxDeaths, MinCounties, MinDeaths).

show_results(MaxCs, MaxD, MinCs, MinD) :-
    % 处理最多死亡数的输出
    (length(MaxCs, 1) ->
        format('The county with the highest amount of deaths is county "~w" with a total of ~w deaths.~n', [MaxCs, MaxD])
    ;
        format('The counties with the highest amount of deaths are ~w with a total of ~w deaths.~n', [MaxCs, MaxD])
    ),
    % 处理最少死亡数的输出
    (length(MinCs, 1) ->
        format('The county with the lowest amount of deaths is county "~w" with a total of ~w deaths.~n', [MinCs, MinD])
    ;
        format('The counties with the lowest amount of deaths are ~w with a total of ~w deaths.~n', [MinCs, MinD])
    ).

运行效果:

?- start.
The county with the highest amount of deaths is county "[a]" with a total of 45 deaths.
The counties with the lowest amount of deaths are [b,c] with a total of 0 deaths.
true.

关键改进点

  1. 不再维护独立的死亡数列表,直接从countyDeaths/2事实提取数据,避免数据冗余和不一致。
  2. 通过findall/3关联县名与死亡数,结合排序或max_list/2/min_list/2找到最值对应的县。
  3. 使用format/2替代write/1,输出格式更灵活易读。

内容的提问来源于stack exchange,提问作者user17244850

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:45:32