同一谓词的子句应该分组

  • 本文关键字:子句 谓词 turbo-prolog
  • 更新时间 :
  • 英文 :


这里我想做一个prolog实现,它将生成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。我不明白我做错了什么。。请帮我

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).

错误或警告:

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([],_).

所以它真的认为你有:

permutations(N,X):-
create(N,X1),
perm(X1,X).
diff(X,2).
permutations_aux(N,X):-
permutations(N,X).
diff([],_).

这是CCD_ 9的定义的交错。

最新更新