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

考试遗留Prolog递归事实代码解析求助

Hey,我来帮你把这段Prolog代码的逻辑理清楚,解决你考试后的疑惑~

考试题目代码解析

你提到的这段Prolog代码本质是实现了一个状态机的路径查询功能,咱们分两部分拆解:

1. 状态转移规则定义

首先是一堆state/3事实,它们定义了状态机的所有转移规则,格式是state(当前状态, 输入字符, 下一状态):

state( 1, f, 2 ). 
state( 2, o, 3 ). 
state( 2, l, 4 ). 
state( 3, n, 5 ). 
state( 3, r, 6 ). 
state( 4, o, 7 ). 
state( 5, d, 8 ). 
state( 6, t, 9 ). 
state( 6, m, 10 ). 
state( 7, u, 11 ). 
state( 8, u, 12 ). 
state( 10, e, 13 ).

举个直观的例子:从状态1输入字符f,就会跳转到状态2;状态2输入o去状态3,输入l去状态4,以此类推。

2. 递归查询谓词find_/3

接下来的find_/3是核心逻辑,它的作用是给定初始状态和一串输入字符,返回最终停留的状态,分为递归和终止两个子句:

递归处理子句

find_( Y1, [ L | ES ], X ) :- 
    state( Y1, L, Y2 ), 
    find_( Y2, ES, X ).

这个子句的逻辑很直白:如果当前在状态Y1,输入字符列表的第一个字符是L,且存在Y1→Y2的转移,那就带着新状态Y2和剩下的字符列表ES继续递归,最终的结果X就是递归到最后的状态。

终止子句

find_( Y, [], Y ).

当输入的字符列表被处理完(空列表),递归就停止了,此时的当前状态Y就是我们要找的最终结果X。

实际运行示例

给你举个具体查询的例子,帮你验证逻辑:
比如执行查询 find_(1, [f, o, r, m, e], X),运行流程是:

  1. 状态1 + f → 状态2
  2. 状态2 + o → 状态3
  3. 状态3 + r → 状态6
  4. 状态6 + m → 状态10
  5. 状态10 + e → 状态13
  6. 字符列表空了,返回X=13

你可以自己换不同的字符列表测试,就能对应上状态机的转移路径啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:48:46