gpt4 book ai didi

recursion - Prolog 中的递归搜索、累加器和计数器

转载 作者:行者123 更新时间:2023-12-04 17:31:42 24 4
gpt4 key购买 nike

在谷歌上长时间搜索后,我找不到明确的答案:
在 Prolog 中,自己做递归很容易。我的主要问题是了解在哪里放置累加器和计数器。下面是一个例子:

nXlist(N,X,[X|T]):-
N \=0,
N1 is N-1,
nXList(N1,X,T).
nXList(0,_,[]).

media([X|L], N, Soma):-
media(L, N1, Soma1),
N is N1 + 1,
Soma is Soma1 + X.
media([], 0, 0).

在第一个示例中,我在递归之前使用了计数器,但在第二个示例中,我在递归之后使用了它。我这样做的原因是所谓的试试看,因为我真的不明白为什么有时在之前,有时在之后......

最佳答案

简短回答:您可以放置​​这样的算术关系 两者 之前和之后。至少,如果您使用约束代替 (is)/2 .唯一的区别可能在于终止和错误。

因此,让我们看看如何使用约束定义谓词:

:- use_module(library(clpfd)).

nXList(0,_,[]).
nXList(N,X,[X|T]):-
N #> 0,
N1 #= N-1,
nXList(N1,X,T).

media([], 0, 0).
media([X|L], N, Soma):-
N #> 0,
N #= N1 + 1,
Soma #= Soma1 + X,
media(L, N1, Soma1).

您现在可以以更通用的方式使用这些定义,例如:
?- nXList(3, X, T).
T = [X, X, X] ;
false.

?- media(Xs, 3, S).
Xs = [_A, _B, _C],
_D+_A#=S,
_C+_B#=_D ;
false.

... nXList/3可以更简洁地表示为:
..., length(T, N), maplist(=(X), T), ...

关于recursion - Prolog 中的递归搜索、累加器和计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42190905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com