PROLOG-正数和负数

时间:2014-08-19 14:36:05

标签: prolog

我收到了必须在PROLOG中解决的以下任务。我们列出了正数和负数以及变量PN。变量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).

3 个答案:

答案 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.