2014-10-22 74 views
2

我想过滤序列表中的列表,使[[a,b,c],[],[d],[e,f]]给出[[a,b,c], [E,F],我的滤波器函数应该忽略长度的元素少于两个, 我尝试是如下的代码,过滤列表序列

omitunwanted([],_) :- []. 
omitunwanted([List|L1],[H|T]) :- 
    ( length(List,0)-> 
     omitunwanted(L1,[H|T]) 
    ; length(List,1)-> 
     omitunwanted(L1,[H|T]) 
    ; append(List,[],H), 
     omitunwanted(L1,T) 
    ). 

它返回输出[[A,b,C],[对于[[a,b,c],[],[d],[e,f]]输入[e,f] | _G1622]。我无法弄清楚我做错了什么

回答

4

这是一个纯粹的版本,甚至适用于其中@垫的版本产生干净instantiation_error这些情况。

length_less_than_two_truth([], true). 
length_less_than_two_truth([_], true). 
length_less_than_two_truth([_,_|_], false). 

texclude( _, [], []). 
texclude(CT, [E|Es], Fs0) :- 
    call(CT,E,Truth), 
    ( Truth = true, 
     Fs0 = Fs 
    ; Truth = false, 
     Fs0 = [E|Fs] 
    ), 
    texclude(CT, Es, Fs). 

?- texclude(length_less_than_two_truth, [X,[a,b,c]],Ls). 
X = [], 
Ls = ["abc"] ; 
X = [_A], 
Ls = ["abc"] ; 
X = [_A, _B|_C], 
Ls = [[_A,_B|_C], "abc"] ; 
false. 

使用library(double_quotes)

3

考虑使用exclude/3。例如:

length_less_than_two(Ls) :- 
    must_be(list, Ls), 
    length(Ls, L), 
    L < 2. 

样品查询及其结果:

?- exclude(length_less_than_two, [[a,b,c],[],[d],[e,f]], Ls). 
Ls = [[a, b, c], [e, f]] 
+0

它的作品,你能告诉我什么must_be/2呢? – sand 2014-10-22 08:37:57

+1

在这种情况下,'must_be'确保列表被充分实例化,以便我们可以可靠地决定是否排除它。如果你省略'must_be/2'目标,例如当列表是[X,[a,b,c]]'时,你将做出错误的决定。 – mat 2014-10-22 09:34:18

2

在这个答案,我们需要在同一行this previous answer

以此为起点考虑下面的查询:

 
?- texclude(length_less_than_two_truth, [[a,b,c],[],[d],[e,f]], Xs). 
    Xs = [[a,b,c],[e,f]]   % succeeds, but leaves choicepoint behind 
; false. 

我们可以对上面的查询得手确定性,同时保持是的!

我们适应texclude/3length_less_than_two_t/2利用第一个参数索引:

texclude(P_2,Es,Fs) :- 
    list_texclude_(Es,Fs,P_2). 

list_texclude_([],[],_). 
list_texclude_([E|Es],Fs0,P_2) :- 
    if_(call(P_2,E), Fs0 = Fs, Fs0 = [E|Fs]), 
    list_texclude_(Es,Fs,P_2). 

length_less_than_two_t([],true). 
length_less_than_two_t([_|Es],T) :- 
    =(Es,[],T). 

注意的length_less_than_two_t/2第二条是基于 (=)/3

使用这种实现,让我们重新运行了OP的问题查询:

 
?- texclude(length_less_than_two_t, [[a,b,c],[],[d],[e,f]], Xs). 
Xs = [[a,b,c],[e,f]].   % succeeds deterministically