Prolog - 输出一个列表?

时间:2008-12-18 13:56:51

标签: prolog

我有功能

sublist(_,[_],_) :-
    !.
sublist(X,[Y|T],Z) :-
    R is X - Y,
    sublist(X,T,[R|Z]).

示例通话为sublist(2,[1,2,3],Z)。 在执行结束时它只是给我'是',但我想看到Z的内容。

我知道这很简单,因为我有其他说明做类似的事情,但这个没有用。

2 个答案:

答案 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].