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

Prolog技术需求:编写判断列表1是否以列表2元素结尾的谓词

实现Prolog的endsWith/2谓词

要判断一个列表是否以另一个列表的元素序列结尾,这里提供两种清晰易懂的实现方式:

方法1:利用内置append/3谓词(简洁高效)

Prolog的append/3谓词原本用于描述“两个列表拼接成第三个列表”的关系,我们可以反向利用它的逻辑:如果存在某个前缀列表,能让前缀 + 目标后缀 = 原列表,那原列表就以目标后缀结尾。

代码实现:

endsWith(List, Suffix) :-
    append(_, Suffix, List).

测试验证

  • 查询 endsWith([a,b,c,d,e], [c,d,e]). → 返回 true,因为存在前缀[a,b],和[c,d,e]拼接后正好得到原列表。
  • 查询 endsWith([a,b,c,d,e], [c,e,d]). → 返回 false,没有任何前缀能和[c,e,d]拼接出原列表。
  • 特殊场景:任何列表都以空列表结尾,查询 endsWith([x,y,z], []). → 返回 true。

方法2:递归实现(适合理解逻辑)

如果想手动拆解递归逻辑,可以基于以下规则编写:

  1. 空列表是任何列表的后缀;
  2. 完全相同的两个列表,前者自然以后者结尾;
  3. 如果原列表的尾部以目标后缀结尾,那整个原列表也满足条件。

代码实现:

% 基础情况1:任何列表都以空列表结尾
endsWith(_, []).
% 基础情况2:列表本身是自己的后缀
endsWith(List, List).
% 递归情况:去掉原列表的第一个元素,递归判断尾部
endsWith([_|Tail], Suffix) :-
    endsWith(Tail, Suffix).

测试验证

  • 查询 endsWith([a,b,c,d,e], [c,d,e]).:递归去掉a、b后,剩余的[c,d,e]和后缀完全匹配,返回true。
  • 查询 endsWith([a,b,c,d,e], [c,e,d]).:递归到最后也找不到匹配的后缀,返回false。

两种实现都能满足需求,追求简洁选方法1,想吃透递归逻辑选方法2就好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:06:37