递归性|列表swish prolog中的自然数
我还有一个问题, “返回数组的自然数” 例如,自然(R,[6,-7,-4,3,2,8])。 R=4 当出现负数时,返回false并中断递归性递归性|列表swish prolog中的自然数,prolog,Prolog,我还有一个问题, “返回数组的自然数” 例如,自然(R,[6,-7,-4,3,2,8])。 R=4 当出现负数时,返回false并中断递归性 naturales(R,[Head|Tail]):-naturales(R1,Tail), Head >= 0, R is R1+1. naturales(0,[]). 如果你的谓词只需要两个参数,一个是结果R,另一个是给定列表[H | T],你可以这样做。请注意,第一个谓词使用3个参数调用第二个“naturales”,然后启动递归过程。C只是一个
naturales(R,[Head|Tail]):-naturales(R1,Tail), Head >= 0, R is R1+1.
naturales(0,[]).
如果你的谓词只需要两个参数,一个是结果R,另一个是给定列表[H | T],你可以这样做。请注意,第一个谓词使用3个参数调用第二个“naturales”,然后启动递归过程。C只是一个计数器,您可以在其中添加正元素的数量,然后在最后一行代码中将该值复制到结果中。第一行只是为了确保空列表返回0个正元素。也许有更好的方法可以做到这一点,这可能是最直观的方法
naturales(X, []):- X = 0.
naturales(R, [H|T]):- naturales(R, [H|T], 0).
naturales(R, [H|T], C):- (H > 0, C1 is C + 1, naturales(R1, T, C1), R = R1) ; naturales(R1, T, C), R = R1.
naturales(X, [], X).
一个常见的prolog习惯用法是使用带有累加器(extra)变量的helper谓词。试着这样做:
natural_numbers( Xs, N ) :- natural_numbers( Xs, 0, N ).
natural_numbers( [] , N , N ) .
natural_numbers( [X|Xs] , T , N ) :-
( X > 0 -> T1 is T+1 ; T1 = T ) ,
natural_numbers( Xs, T1, N ).
以下是一个非常简短的解决方案:
naturales(In, Out) :-
aggregate(count,X^(member(X, In), X >= 0), Out).
正如其他人指出的,当有负数时,递归调用无法完成。所以,你可以用这种方式修补你的程序
naturales(R[Head | Tail]):-naturales(R1,Tail),(Head>=0,R是R1+1;R=R1)。
自然值(0,[])。
现在,几乎所有的Prolog(除了:)都实现了(->)/2,也称为“if-then-else”。因此,补丁也可以写成
naturales(R[Head | Tail]):-naturales(R1,Tail),(Head>=0->R为R1+1;R=R1)。
自然值(0,[])。
考虑到naturales/2无论如何都不是尾部递归的(参见@NicholasCarey的答案),我认为它对您没有实际意义