从 Prolog 中的列表中删除项目

问题描述 投票:0回答:1

我在理解我的教授在课堂上与我们分享的一段代码时遇到了一些困难:

takeout(X, [X|R], R).
takeout(X, [F|R], [F|S]) :- takeout(X,R,S)

代码的总体思路是删除元素X。但是,我有点困惑为什么在第二行代码中有两个参数都以F 为头部。我也不完全理解关系 :- takeout(X,R,S) 相对于该行代码第一部分的含义。我想知道这是否意味着正在发生某种循环。

当我使用

?- takeout(a, [1,2,3,a,b,c,b], X)
运行代码时,我得到了预期的结果 X = [1,2,3,b,c,b]。如果有人能帮助我更好地理解这两行代码,那将不胜感激,因为我是 prolog 的新手。

prolog
1个回答
0
投票

第一行是谓词的基本情况:如果原始列表中的第一个元素与您需要删除的元素相等,则只有当第三个参数是列表的其余部分时,谓词才为真。第二行是谓词的递归步骤。由于 Prolog 执行顺序,仅当列表中的第一个元素不等于要删除的元素时才进行测试。该行说的是:“只有当谓词 takeout(X,R,S) 为真时,谓词 takeout(X, [F|R], [F|S]) 才为真”。所以程序继续测试原始列表其余部分的谓词。重要的是要说明,如果没有要删除的项目,则谓词将为假。如果您不希望发生这种特殊情况,则需要添加另一个基本案例:takeout(_, [], []).

© www.soinside.com 2019 - 2024. All rights reserved.