我有功能
sublist(_,[_],_) :-
!.
sublist(X,[Y|T],Z) :-
R is X - Y,
sublist(X,T,[R|Z]).
示例通话为sublist(2,[1,2,3],Z)
。
在执行结束时它只是给我'是',但我想看到Z的内容。
我知道这很简单,因为我有其他说明做类似的事情,但这个没有用。
答案 0 :(得分:3)
我还假设子列表/ 3应该从列表中的所有项目中减去一个数字。
你没有得到Z的任何结果的原因是因为你在进入递归的过程中构建了列表。这意味着当停止谓词成功时,Prolog会从递归中恢复出来,并且Z会再次被实例化。
Z is ?
|
Z is [-1]
|
Z is [-1, 0]
|
Z is [-1, 0, 1]
|
Z is [-1, 0]
|
Z is [-1]
|
Z is ?
首先尝试进入递归并在出路时构建列表。也许是这样的:
subtract_list(_, [], []).
subtract_list(Number, [Head|Tail], [Subtracted|Result]):-
subtract_list(Number, Tail, Result),
Subtracted is Head - Number.
我们所改变的只是递归谓词中规则的顺序和停止条件的条款。现在它递归直到它到达一个空列表,此时它也用空列表实例化结果变量。然后它会冒泡回来向列表中添加值。
?- subtract_list(1,[4,3,2],Z).
Z = [3, 2, 1]
希望这会有所帮助。汤姆
答案 1 :(得分:1)
你没有真正指明sublist/3
应该做什么,但也许你的意思是:
sublist(_, [], []) :- !.
sublist(X, [Y | T], [R | Z]) :-
R is X - Y,
sublist(X, T, Z).
用法示例:
?- sublist(2, [1, 2, 3], Z).
Z = [1, 0, -1].
顺便说一句,如果您不想自己迭代列表,那么您可以使用SWI-Prolog提供的maplist/3
。首先定义您想要的计算:
my_calculation(X, Y, Z) :-
Z is X - Y.
然后拨打maplist/3
:
?- maplist(my_calculation(2), [1, 2, 3], Z).
Z = [1, 0, -1].