Prolog"过滤"一个列表

时间:2016-01-28 21:32:42

标签: list filter prolog

我正在尝试为我的学校解决一项练习,其中我被要求制作一个名为过滤器(+ Lin,+ Min,+ Max,-Lout)的函数,它应该修改Lin (列表),以便Lout(List)只有在Min和Max。

设置的限制范围内的数字
ex. ?- filter([1,2,3,4,5,6,7,8],3,6,L).
L = [3, 4, 5, 6].

我尝试了很多东西,我也在这里寻找答案,但Prolog的逻辑中有一些我无法得到的东西......

到目前为止我做了什么。如果头部在限制范围内,我每次都使用斩波功能将头部附加到列表中。

chop([H|T],H,T).

filter([],MIN,MAX,[]).
filter([H|T],MIN,MAX,LOUT):-(H>MIN,H<MAX),
    chop(LOUT,H,LIST),filter(T,MIN,MAX,LOUT).
filter([H|T],MIN,MAX,LOUT):-(H<MIN;H>MAX),
    filter(T,MIN,MAX,LOUT).

如果你能回答我的问题并且你不在乎解释我会非常感激!

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

首先,您必须创建一个处理空列表的规则:

Min

然后处理Maxfilter([X|Lin], Min, Max, [X|Lout]) :- X >= Min, X =< Max, !, filter(Lin, Min, Max, Lout). 之间的元素的规则:

filter([_|Lin], Min, Max, Lout) :- filter(Lin, Min, Max, Lout).

最后,您需要一个忽略元素超出范围的规则:

sed

这就是全部!

答案 1 :(得分:0)

我在你的问题中找不到问题,所以提出了一些建议和意见。

执行此操作的直接方法是使用两个库谓词between/3include/3。来自library(apply)的BTW,include/3exclude/3是(SWI-)Prolog的filter

?- include(between(3, 6), [1,2,3,4,5,6,7,8], Out).
Out = [3, 4, 5, 6].

至于你自己的解决方案:它几乎就在那里,但它有一些奇怪的东西在继续。就我所见,您根本不需要chop/3。 还有一些不必要的括号。如果您将其写为:

,则第二个子句看起来更为熟悉
filter([X|Xs], Min, Max, [X|Ys]) :-
    X >= Min,
    X =< Max,
    filter(Xs, Min, Max, Ys).

请注意,这也不会在Min-Max范围的限制内出现一个一个错误。

另一方面,最后一个条款有一些你打算用作逻辑OR的东西,但是这个:( X < Min ; X > Max )并不完全是你认为的那样。看:

?- ( 1 < 3 ; 1 > 6).
true ;
false.

这是真的,是假的。更确切地说:

?- \+ ( 1 >= 3, 1 =< 6 ).
true.

甚至更好:

?- \+ between(3, 6, 1).
true.