所以我在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.任何帮助表示赞赏:)
我认为你正在尝试使用一种称为累加器的模式,用一个包含中间结果的附加参数重写二元关系.
除了语法错误之外,你应该注意一个累加器在这里没用,因为列表的每个元素只与另一个列表的相应元素有关.
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)