English 中文(简体)
Prolog - 输出列表?
原标题:
  • 时间:2008-12-18 13:56:51
  •  标签:

我有这个函数

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

an example call is sublist(2,[1,2,3],Z). At the end of execution it just gives me yes , but i d like to see the contents of Z.

我知道这是一件简单的事情,因为我有其他类似的指示,但这一个不起作用。

问题回答

我还会假设sublist/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] 

希望这能有所帮助。汤姆

你并没有明确说明 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].




相关问题
热门标签