Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
递归性|列表swish prolog中的自然数_Prolog - Fatal编程技术网

递归性|列表swish prolog中的自然数

递归性|列表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只是一个

我还有一个问题, “返回数组的自然数”

例如,自然(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只是一个计数器,您可以在其中添加正元素的数量,然后在最后一行代码中将该值复制到结果中。第一行只是为了确保空列表返回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的答案),我认为它对您没有实际意义