为了账号安全,请及时绑定邮箱和手机立即绑定

序言:过滤列表?

/ 猿问

序言:过滤列表?

慕前端131612 2019-10-21 15:14:03

我目前正在Prolog上进行一个非常短的项目,只是试图将我创建的“过滤器”应用到列表中而陷入困境。我已经准备好了您可以称为过滤器的内容,但是我无法应用它。如果我说明一下会更好:


filter(A, B) 

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


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

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


我已经准备好“过滤器”功能,但是现在我需要将其应用到第二个示例所示的列表中,但不包括在与第一个参数一起应用时过滤器返回true的所有元素。


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


我在使用该函数的基本结构时遇到了麻烦,因此,如果有人可以为此类函数提供基本轮廓,那将很有帮助。我已尽可能简化我的情况,以便您可以根据我的需要提供和修改它。


提前致谢!


查看完整描述

3 回答

?
饮歌长啸

如果要在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).

我对这个谓词有疑问,请在评论中问我。读报纸也很值得推荐,它也definess map,foldr以及compose!请注意,他提到的许多限制(例如,缺失call/3或更高阶的限制apply都不再适用。SWI-Prolog具有=..运算符,该运算符可解决他的所有问题,并使任意n阶逻辑成为可能。


查看完整回答
反对 回复 2019-10-21
?
慕姐829404

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].


查看完整回答
反对 回复 2019-10-21
?
弑天下

过滤器函数存在一个固有的问题,该函数将谓词的成功或失败作为过滤的准则:生成的程序不再是纯单调程序。因此,它失去了所有声明性属性-剩下的唯一含义是程序上的逐步解释。这是使用的纯净过滤版本if_/3:


tfilter(_CT_2,    [], []).

tfilter(CT_2, [E|Es], Fs0) :-

   if_(call(CT_2,E), Fs0 = [E|Fs], Fs0 = Fs ),

   tfilter(CT_2, Es, Fs).

因此,第一个参数是一个闭包/继续符,它将接收另外两个参数:元素和结果真值。


=(X,X,true).

=(X,Y,false) :- dif(X,Y).

现在,结果仍然精确:


| ?- tfilter(=(X),[A,B],Xs).

B = A,

X = A,

Xs = [A,A] ? ;

X = A,

Xs = [A],

dif(A,B) ? ;

X = B,

Xs = [B],

dif(B,A) ? ;

Xs = [],

dif(X,A),

dif(X,B) ? ;

no

如何用等于的准则过滤两个元素的列表X。每个元素可能相等或不同。


这种方法的缺点是必须提供所有标准的简化版本。


查看完整回答
反对 回复 2019-10-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信