gpt4 book ai didi

prolog - prolog 中列表元素的总和

转载 作者:行者123 更新时间:2023-12-02 11:42:54 25 4
gpt4 key购买 nike

我想对这样的列表元素求和:

sum([1,[2,3],4],S).

我用过它,但我有一个问题:

sum([],0).
sum([T|R],M) :- sum(R,S), M is T+S.

我收到以下错误:

ERROR: is/2: Type error: `[]' expected, found `[2,3]' (a list) ("x" must hold one character)

最佳答案

问题是如果 T 是列表,则无法添加 T。如果 T 是一个列表,您可以使用 is_list/1 轻松解决问题:

sum([],0).
sum([T|R],M) :- (is_list(T) -> sum(T,N1),sum(R,S), M is N1+S
; sum(R,S), M is T+S ).

示例:

?- sum([1,[2,3],4],S).
S = 10.

?- sum([1,2,3,4],S).
S = 10.

?- sum([1,[2],[3],4],S).
S = 10.

?- sum([1,[[2],[3]],4],S).
S = 10.

更好的方法是使用 CLPFD:

:- use_module(library(clpfd)).

sum([],0).
sum([[]],0).
sum([T|R],M) :- (is_list(T) -> sum(T,N1),sum(R,S), M #= N1+S
; sum(R,S), M #= T+S ).

现在您可以查询更一般的问题,例如:

?- sum(L,N).
L = [],
N = 0 ;
L = [[]],
N = 0 ;
L = [N],
N in inf..sup ;
L = [N, []],
N in inf..sup ;
L = [_1836, _1842],
_1836+_1842#=N ;
L = [_1842, _1848, []],
_1842+_1848#=N ;
L = [_2142, _2148, _2154],
_2142+_2192#=N,
_2148+_2154#=_2192 ;
L = [_2148, _2154, _2160, []],
_2148+_2204#=N,
_2154+_2160#=_2204 ;
L = [_2448, _2454, _2460, _2466],
_2448+_2504#=N,
_2454+_2528#=_2504,
_2460+_2466#=_2528 ;

然后继续...

关于prolog - prolog 中列表元素的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42458241/

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