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

Prolog项目入门:数据存储与最值查询规则技术咨询

Prolog入门:表格数据存储与最大值查找指导

1. 用Prolog事实存储表格数据

Prolog里没有“表格”这种结构,直接用自定义谓词事实对应表格的每一行就行。比如你的表格是「学生-科目-分数」的结构,就定义一个谓词(比如student_score/3,数字表示参数个数),每一行数据对应一条事实:

% 示例:对应表格的4行数据
student_score(alice, math, 85).
student_score(bob, math, 92).
student_score(charlie, math, 78).
student_score(alice, english, 90).
  • 谓词名可以自己取(比如如果是销售数据就叫sales_record/4),参数顺序对应表格的列,类型支持字符串、数字、原子。
  • 后续所有查询都直接基于这些事实展开,比如查alice的数学成绩:student_score(alice, math, Score).,Prolog会返回Score = 85。

2. 编写查找最大值的规则

Prolog不用数组排序,靠递归遍历+回溯实现最大值查找,分两步:先收集目标数据到列表,再递归找列表最大值。

第一步:写递归找列表最大值的辅助规则

% 基础情况:列表只有一个元素,最大值就是它本身
find_max([X], X).

% 递归情况1:头元素比剩余列表的最大值大,取头元素
find_max([Head|Tail], Max) :-
    find_max(Tail, TailMax),
    Head > TailMax,
    Max = Head.

% 递归情况2:头元素小于等于剩余列表的最大值,取剩余列表的最大值
find_max([Head|Tail], Max) :-
    find_max(Tail, TailMax),
    Head =< TailMax,
    Max = TailMax.

第二步:结合事实写业务场景的最大值规则

比如要找某门科目的最高分:

% 先收集该科目所有分数到列表,再调用辅助规则找最大值
max_subject_score(Subject, MaxScore) :-
    findall(Score, student_score(_, Subject, Score), AllScores),
    AllScores \= [],  % 避免空列表报错
    find_max(AllScores, MaxScore).

调用示例:max_subject_score(math, Max).,会返回Max = 92。

如果要找最高分对应的学生,直接扩展规则就行:

max_score_student(Subject, Student, MaxScore) :-
    max_subject_score(Subject, MaxScore),
    student_score(Student, Subject, MaxScore).

调用示例:max_score_student(math, Student, Max).,返回Student = bob, Max = 92。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:24:33