2014-01-13 1 views
0

여기서 두 개의 연속 값 사이의 절대 차이를 갖는 n, n + 1, ... 2 * n-1의 순열 목록을 생성하는 프롤로그 구현을 만들고 싶습니다 < = 2. 예 : n=4의 경우 순열을 만드는 목록은 [4,5,6,7]이고 유효한 순열은 [5,4,6,7]이고 유효하지 않은 것은 [7,4,6,5]이 될 수 있습니다. 왜냐하면 7-4 is 3이 있기 때문입니다. 문제는 다음과 같은 오류가 나타납니다. clauses for the same predicate should be grouped. 나는 wrong..Please 나에게동일한 술어에 대한 절을 그룹화해야 함

domains 
    el=integer 
    list=el* 
    lista=list* 
predicates 
    perm(list,list) 
    permutations(integer,list) 
    delete(integer,list,list) 
    generate(integer,lista) 
    create(integer,list) 
    create_list(integer,integer,list) 
    permutations_aux(integer,list) 
    diff(list,integer). 
clauses 
    create(N,L):- 
     M = 2*N, 
     create_list(N,M,L). 

    create_list(N,M,[N|R]):- 
     N<M, 
     N1=N+1, 
     create_list(N1,M,R). 

    create_list(M,M,[]). 

    perm([],[]). 
    perm(Y,[A|X]):- 
     delete(A,Y,Y1), 
     perm(Y1,X). 

    delete(A,[A|X],X). 
    delete(A,[B|X],[B|Y]):- 
     delete(A,X,Y). 

    permutations(N,X):- 
     create(N,X1), 
     perm(X1,X). 
     diff(X,2). 

    permutations_aux(N,X):- 
     permutations(N,X). 

    diff([],_). 
    diff([_],_). 
    diff([X,Y|T],M):- 
     abs(Y-X) <=M,!, 
     diff([Y|T],M). 

    generate(N,R):- 
     findall(X,permutations_aux(N,X),R). 


goal 
generate(4,P), 
write(P). 
+0

오, 나는 믿을 수 없다. 얼마나 어리석은 지 .. 감사합니다 – user3043278

+0

아, 몇 번 해봤습니다. 이제 오류를 보았으므로 처음 확인한 것 중 하나가됩니다. :) – lurker

답변

1

오류 또는 경고 도움이 무슨 짓을했는지 이해가 안 :

Clauses for the same predicate should be grouped 

서로 다른 조항의 정의를 끼워 의미합니다. 즉, 같은 이름의 술어에 대한 절이 모두 그룹으로 함게 정의되어야합니다. 예를 들면 :

foo(X) :- 
    some stuff 
foo(Y) :- 
    some stuff 

bar(X) :- 
    some stuff 
bar(Y) :- 
    some stuff 

당신은 당신이 경우에 경고/오류가 발생합니다 :

foo(X) :- 
    some stuff 

bar(X) :- 
    some stuff 

foo(Y) :- 
    some stuff 

bar(Y) :- 
    some stuff 

귀하의 오류는 당신이 당신의 permutations 절에 perm(X1,X). 후 기간이 있다는 것입니다.

permutations(N,X):- 
    create(N,X1), 
    perm(X1,X).  <--- Error here 
    diff(X,2). 

permutations_aux(N,X):- 
    permutations(N,X). 

diff([],_). 

그래서 정말 당신이 생각 : 그것은 쉼표해야

diff에 대한 정의의 인터리브입니다
permutations(N,X):- 
    create(N,X1), 
    perm(X1,X). 

diff(X,2). 

permutations_aux(N,X):- 
    permutations(N,X). 

diff([],_). 

.

+0

감사합니다. 당신은 매우 분명합니다. 나는 모든 것을 이해했습니다. – user3043278