我正在尝试为我的学校解决一项练习,其中我被要求制作一个名为过滤器(+ 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).
如果你能回答我的问题并且你不在乎解释我会非常感激!
感谢您的时间。
答案 0 :(得分:0)
首先,您必须创建一个处理空列表的规则:
Min
然后处理Max
和filter([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/3
和include/3
。来自library(apply)
的BTW,include/3
和exclude/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.