2014-09-20 63 views
0

是否有可能将每个第i个元素从列表复制到子列表中只是一个三元谓词子列表(Element,List1,List2)和内置的长度和追加? 我知道,使用4元素的辅助谓词,它变得相当微不足道,但它不是我所需要的。 有人可以提出一个策略吗?Prolog每个子元素中的第i个元素

回答

2

一些内建的声明解决方案是非常简单:

sublist(Element, List1, List2) :- 
    findall(E, (nth1(I, List1, E), 0 is I mod Element), List2). 

而明确地迭代:

sublist(Element, List1, List2) :- 
    ( N is Element-1, 
     length(T, N), 
     append(T, [E|R], List1) 
    -> sublist(Element, R, ListR), 
     List2 = [E|ListR] 
    ; List2 = [] 
    ). 

你可以在哪里看到如何se鲍里斯的建议

+2

findall/3没有任何错误,并声明不聚集在一起。 – false 2014-09-20 20:54:54

+0

关于箭头,(条件 - > WhenTrue; WhenFalse)。我没有得到其他问题 – CapelliC 2014-09-21 05:37:56

1

您可以使用lentgth/2的第一个参数一个变量,第二次的整数,创建没有实例变量的列表,像这样:

?- length(L, 4). 
L = [_G936, _G939, _G942, _G945]. 

如果你现在使用append/3与此列表作为第一参数,并作为第二变量,它会在你的第三个参数拆分列表:

?- length(A, 4), append(A, B, [a,b,c,d,e,f,g,h]). 
A = [a, b, c, d], 
B = [e, f, g, h]. 

所以,如果你想要说列表的第5个元素,你可以采取的第二个参数的头:

?- length(A, 4), append(A, [Fifth|Rest], [a,b,c,d,e,f,g,h]). 
A = [a, b, c, d], 
Fifth = e, 
Rest = [f, g, h]. 

这不是一个解决方案,但一个有效的策略:

every_ith(I, In, [X|Ys]) :- 
    N is I - 1, 
    length(Prefix, N), 
    append(Prefix, [X|Xs], In), 
    every_ith(I, Xs, Ys). 
+1

如果我正确理解此代码,它只是寻找和元素列表中给定的数字。我所需要的是将每一个第i个元素复制到列表中。像这样:sublist([1,2,3,4],2,X)。 X = [2,4]。这段代码有帮助吗?元素搜索可以更容易完成。我错过了什么吗? – user3614293 2014-09-20 04:01:26

+2

你问过一个策略,而不是一个解决方案。看看编辑一个更大的提示。 – 2014-09-20 13:11:01

相关问题