2013-11-22 2 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 (목록) P 3 (조합으로 말하기) 또는 B와 C가 각각 [88,10,11]과 [10,11]'로 유지됩니까 –

+0

나는 모든 것을 요소들, B와 C는 동일하게 남겨 두어야합니다. 왜냐하면 당신은 A의 다음 요소와 모든 가능한 조합으로 그것을 수행해야하기 때문입니다. BTW A, B 및 C는 for의 인덱스입니다. – EricJ

+0

A가 '7'에서 '88'로 진행하면 B는'[88,10,11]'에서'[10,11]'로 줄어들거나'[7,10,11]' –

답변

0

실제 프롤로그 코드는 매우이다 당신은 SQL에 참여로 쉼표 연산자 생각할 수

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

귀하의 설명과 유사 (선택 간단한 문법에 * 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)))). 

(희망 I 균형을 바로 괄호 ...)

편집해야합니다 죄송합니다, 나는 완전히 놓친 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보다 작아야하므로 list.Also 이 조합은 첫 번째 것과 같습니다. – EricJ

+0

마지막으로 해냈습니다! 감사합니다. forall ((select (A, L, L1), select (B, L1, L2), member (D, L3), B> A, C> B , D> C), writeln (ABCD)). – EricJ

관련 문제