【问题标题】:Prolog predicate that returns a list after checking for elementProlog 谓词在检查元素后返回一个列表
【发布时间】:2018-04-10 01:40:16
【问题描述】:

我是序言的新手。我正在尝试编写一个接受元素和列表的谓词,并检查列表中元素的出现情况,并在元素之后返回列表的其余部分。
示例是 mypredicate(3, [1 2, 3, 4, 5, 6, 7]) 返回 [3, 4, 5, 6, 7]。
我希望我能够解释。

mypredicate(X, [X|_]).
mypredicate(X, [_|T]) :- mypredicate(X,T).

这基本上只是检查元素是否在列表中。 如何编写返回 X 之后列表其余部分的规则?

【问题讨论】:

    标签: list prolog predicate


    【解决方案1】:

    您需要在基本情况下返回所有列表,例如:

    mypredicate(X, [X|T],[X|T]).
    

    还有子句:

     mypredicate(X, [_|T]) :- mypredicate(X,T).
    

    当列表的头部是 X 时使用,因此您需要确保在这种情况下头部与 X 不同,例如:

    mypredicate(X, [H|T],L) :- dif(X,H),mypredicate(X,T).
    

    【讨论】:

    • mypredicate(X, [X|T]). 在任何实际用途上都与 OP' 子句相同,即 T 单身
    • @CapelliC,谢谢(+1)!!!编辑了答案,我没有看到我错过了一个参数,因为我没有尝试测试它......
    【解决方案2】:

    你应该添加第三个参数

    mypredicate(X,[X|L],[X|L]).
    mypredicate(X,[_|T],L) :- mypredicate(X,T,L).
    

    如果您只对XL 的第一次出现感兴趣,请在第一条规则处添加删减:

    mypredicate(X,[X|L],[X|L]) :- !.
    

    另一种方式,使用库(列表)谓词:

    edit@tim.newport 评论后更正

    mypredicate(X,L,[X|T]) :- append(_,[X|T],L).
    

    【讨论】:

    • 一旦找到该项目,这只会返回尾巴而不是头部。搜索 3 时返回 X = [4,5,6,7]。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多