我如何 return Prolog 中的特定列表?

How do I return a specific list in Prolog?

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

此代码returnsR = [].

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).

有什么帮助吗?

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

好的,我来做:teilliste_grK([1,4,2,5,3,6],3,X) 应该成功,将 X 实例化为 [4,5,6],对吗?现在试试看它匹配的是哪个子句。

所以它与第二个匹配,1 确实是 =< 3,最后一行说,继续没有头元素(比给定的 K 小), 无论我们从那里得到什么 R,也是我们的 RR 毕竟是 R

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

它再次匹配,不等式成立,但是你做了一些奇怪的事情。你首先说 C 是一个比 R 长的元素,然后你从 更短的 列表中得到 C - 尾部 Ta 你的输入。无论您在最后一个子句(第一个子句)中设置 R,这是不可能的。

你想让你的CR短,也就是从刚通过测试的同一个头Ha开始,所以参数只需要换个顺序:

    append([Ha], C, R),

(不过你可以写得更短更简单,而不需要调用 append——它是什么?)。

那么最后一个(第 3 个,即 [])子句呢?如果你调用 teilliste_grK([],3,X)X 应该是什么?