在Prolog中计算多维数据集列表

Wha*_*nny 1 prolog clpfd

所以我在SWI-Prolog做了一些Prolog,我遇到了一些障碍.在给定输入列表的情况下,我必须创建一个立方体列表.我目前的代码是

cubes([Head|Tail],Cubes) :-
    cubes([Head|Tail],Cubes,[]).
cubes([Head|Tail],Cubes,ActualCubes) :-
    X is Head^3,
    append(ActualCubes,[X],NewCubes),
    cubes(Tail,Cubes,NewCubes).
cubes([Tail],Cubes,ActualCubes) :-
    X is Tail^3,
    append(ActualCubes,[X],NewCubes),
    Cubes is NewCubes.
Run Code Online (Sandbox Code Playgroud)

当我运行它时会出错,具体而言......

ERROR: '.'/2: Type error: `[]' expected, found `[8]' ("x" must hold one character)
   Exception: (7) cbList([1, 2], _G296, []) ? creep
Run Code Online (Sandbox Code Playgroud)

我不完全确定为什么会出现这个错误,但它似乎发生在最后一行,Cubes是NewCubes.任何帮助表示赞赏:)

Cap*_*liC 5

我认为你正在尝试使用一种称为累加器的模式,用一个包含中间结果的附加参数重写二元关系.

除了语法错误之外,你应该注意一个累加器在这里没用,因为列表的每个元素只与另一个列表的相应元素有关.

库(apply)对于这种常见情况有maplist/3:

cube(N, C) :-
    C is N^3.
cubes(Ns, Cs) :-
    maplist(cube, Ns, Cs).
Run Code Online (Sandbox Code Playgroud)

和库(clpfd)有一些有趣的功能,允许(在整数域中)更好的算术关系处理.用上面的立方体替换

:- [library(clpfd)].

cube(N, C) :-
    N ^ 3 #= C.
Run Code Online (Sandbox Code Playgroud)

你被允许写

?- cubes(X,[1,8,27]).
X = [1, 2, 3].
Run Code Online (Sandbox Code Playgroud)