我收到了必须在PROLOG中解决的以下任务。我们列出了正数和负数以及变量P
和N
。变量P
必须在列表中包含多个正数,变量N
必须包含多个负数。如果列表中的所有数字都是正数,那么我制作的部分效果很好,但随后崩溃了。有人能帮助我吗?感谢
numbers([],0,0).
numbers([G|R],P,N):-
numbers(R,NR,NN),
P is NR+1,
G>0.
numbers([G|R],P,N):-
numbers(R,NR,NN),
N is NN+1,
G<0.
numbers([],P,N).
答案 0 :(得分:2)
首先,基本情况:当一个列表为空时,没有数字
numbers([], 0, 0).
现在,对于一般情况
numbers([H|T], X, Y) :-
% you compute the rest of the list
numbers(T, X1, Y1),
% you increment the correct number
(H > 0
-> X is X1 + 1, Y1 = Y
; H < 0
-> X = X1, Y is Y1+1
; X = X1, Y1 = Y).
编辑我修复了0
的情况答案 1 :(得分:1)
尝试这样的事情。常见的Prolog习语是使用辅助谓词和累加器:
count_by_sign( Xs , P , N ) :- count_by_sign( Xs , 0 , 0 , P , N ) .
count_by_sign( [] , P , N , P, N ) .
count_by_sign( [X|Xs] , A , B , P , N ) :-
tick(X,A,B,A1,B1) ,
count_by_sign(Xs,A1,B1,P,N)
.
tick( X , P , N , P , N1 ) :- % negative numbers
X < 0 ,
N1 is N+1
.
tick( X , P , N , P1 , N ) :- % positive numbers
X > 0 ,
P1 is P+1
.
tick( X , P , N , P , N ) :- % zero is unsigned
X = 0
.
答案 2 :(得分:1)
以下是如何使用库(aggregate):
numbers(L,P,N) :-
aggregate(t(sum(P),sum(N)),
X^(member(X,L), (X > 0 -> P=1,N=0 ; X < 0 -> P=0,N=1)), t(P,N)).
试验:
?- numbers([3,-1,4,0,-4,1],P,N).
P = 3,
N = 2.