当前位置:  开发笔记 > 前端 > 正文

Prolog:过滤清单?

如何解决《Prolog:过滤清单?》经验,为你挑选了2个好方法。

我目前正在开发一个关于Prolog的非常短的项目,并且试图将我创建的"过滤器"应用到列表中.我有你可以称之为过滤器的东西,但我无法应用它.如果我说明一下会更好:

filter(A, B) 

...如果满足某些条件,则输出'true'.

filterList(A, [X, Y, Z])

...输出一个列表,其中包含第二个参数中使过滤器输出为false的所有元素.(因此,如果过滤器(A,X)为真,则输出为[Y,Z]).

我已准备好"过滤器"功能,但现在我需要将它应用于第二个示例中所示的列表,排除在应用第一个参数时过滤器返回true的所有元素.

因此,如果过滤器是简单的A == B,则该函数应该接收A [A,B,A,C,D,A]并输出[B,C,D],删除了所有元素显然,过滤器适用.

我在功能的基本结构方面遇到了麻烦,所以如果有人能为这样的功能提供一个基本的轮廓,那将会有很大的帮助.我尽可能地简化了我的情况,所以我可以拿出你能提供的任何东西,并根据我的需要进行修改.

提前致谢!



1> Aleksandar D..:

如果您正在Prolog中搜索高阶函数,那么您应该明确地咨询Naish(1995),这是一个非常好的资源.

他的定义filter/3如下(他使用差异列表表示法,因此不得不定义filter/4):

filter(_,[],[]).
filter(P, A0-As0, As) :-
    (
        call(P, A0) -> As = A0-As1
    ;
        As = As1
    )
    , filter(P, As0, As1).

我对这个谓词有疑问,请在评论中问我.阅读论文也是强烈推荐的,它也很狡猾map,foldr而且compose!请注意,他提到的许多限制(例如,缺失call/3或更高阶apply不再适用.SWI-Prolog有=..操作符,它解决了他所有的问题并使任意n阶逻辑成为可能.


请参阅讨论为什么Naish Reference有争议:http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/naish.html

2> Kaarel..:

SWI-Prolog提供exclude/3和其他此类元谓词.您的原始问题可以这样编码:

are_identical(X, Y) :-
    X == Y.

filterList(A, In, Out) :-
    exclude(are_identical(A), In, Out).

用法示例:

?- filterList(A, [A, B, A, C, D, A], Out).
Out = [B, C, D].

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有