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:任何列表都以空列表结尾 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
相关产品推荐
相关产品推荐

