如何在Prolog中返回特定列表?

时间:2015-04-18 19:58:56

标签: list prolog append

我已经编写了一个小型的Prolog程序,该程序应该检查一个列表并查看头部Ha是否大于K,如果是,它应该是将其附加到列表R,并在检查完整个列表后返回R,然后将包含大于K整数的内容。

此代码返回R = []

teilliste_grK([],_,_).

teilliste_grK([Ha|Ta], K, R) :-
    Ha =< K,
    teilliste_grK(Ta,K,R).

teilliste_grK([Ha|Ta], K, R) :-
    Ha > K,
    append(R, [Ha], C),
    teilliste_grK(Ta, K, C).

任何帮助?

1 个答案:

答案 0 :(得分:1)

你应该写出你如何用一些样本数据来调用这个谓词,以及你期望从中获取什么样的数据。这个很重要。 :)

好的,我会这样做:teilliste_grK([1,4,2,5,3,6],3,X)应该成功,将X实例化为[4,5,6],对吗?现在尝试查看它与哪些条款匹配。

所以它匹配第二个,1确实是=< 3,最后一行说,继续没有head元素(小于给定的K),并且< em>我们从那里得到R,我们的R以及 - R毕竟是R

好。那么当我们接下来4时,会发生什么?第二个子句匹配,但随后被4 =< 2拒绝。好。关于第三个条款。

它再次匹配,并且不等式成立,但是你做了一些奇怪的事情。您首先要说C是一个比R更长的元素,而C来自更短的列表 - 您的尾Ta输入。无论你在最后一个条款(第一个)中设置了R,这都不可能。

您希望C短于R,这是从刚刚通过测试的同一个头Ha开始,因此需要将参数放入不同的顺序:

    append([Ha], C, R),

(你可以写这个更短更简单,不需要调用append - 它是什么?)。

那么最终(第3个,即[])条款呢?如果您致电teilliste_grK([],3,X)X应该是什么?