2013-11-22 153 views
1

我是新的序言,我有一個問題。對於列表中的每個元素

我喜歡數字列表[7,88,10,11]我想要做的是:

for each element in [7,88,10,11] A 

     for each element in [88,10,11] B 
       for each element in [10,11] C 
         write(A-B-C). 

我希望所有的組合列表中(3個元素的排列)。

謝謝!

編輯:列表是一個例子,實際的名單L:

list(L,J) :- findall(X,(task(X,K),K==J),L). 

於是我想重複我一樣通過單說L.

+0

所以,你想要len(list)P 3(組合說話),還是B和C分別保持爲[88,10,11]和[10,11]' –

+0

我的意思是像一個for遍歷所有元素,B和C必須保持不變,因爲那麼你必須用A的下一個元素來完成所有可能的組合。 BTW A,B和C是for的索引,這是一個例子。 – EricJ

+0

當A從「7」進展到88時,B從「[88,10,11]」縮小到「[10,11]」,還是變成了「[7,10,11]」 –

回答

0

實際序言代碼是非常類似於您描述

?- forall((member(A, [7,88,10,11]), 
      member(B, [88,10,11]), 
      member(C, [10,11]) 
     ), writeln(A-B-C)). 

你能想到的逗號操作符作爲加入SQL(在簡單的語法SELECT * FROM A,B,C)

編輯:當然,該代碼是不是完全類似於您的描述。應改用

?- forall(member(A, [7,88,10,11]), 
      forall(member(B, [88,10,11]), 
       forall(member(C, [10,11]), writeln(A-B-C)))). 

(希望我平衡向右括號...)

編輯:對不起,我完全錯過了A,B,C之間的關係。

?- L = [7,88,10,11], 
    forall((select(A,L,L1), 
      select(B,L1,L2), 
      member(C,L2) 
     ), writeln(A-B-C)). 

是否更好?

+0

那麼,事情是我不知道列表中的元素,它們在變量L中,所以我不能這樣做...... – EricJ

+0

謝謝非常!但現在我有一個問題: 1 2 3 4, 1 2 3 5, 1 2 3 6, 1 2 4 3 < - 最後一個數字應該是5,因爲它晚於列表中的4。這個組合與第一個相同。 – EricJ

+0

終於做到了!非常感謝: forall((選擇(A,L,L1),選擇(B,L1,L2),選擇(C,L2,L3),成員(D,L3),B> A,C> B ,D> C),寫(ABCD))。 – EricJ

相關問題