2014-09-20 98 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

相關問題