2015-04-18 36 views
2

我写了一个小的Prolog程序,应该检查一个列表,看看头部Ha是否大于K,如果是,应该将它附加到列表R并检查完整列表后返回R然后它将由大于K的整数组成。如何返回Prolog中的特定列表?

此代码返回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

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

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

因此,它与第二匹配,1确实=< 3,最后一行说,继续无头元素(这是比给定K更小),和无论R我们从那里得到的,是我们的R为井R毕竟是R

好。所以当我们来到4时,会发生什么?第二个子句匹配,但被4 =< 2拒绝。好。关于第三条。

它再次匹配,不平等成立,但你做了一些奇怪的事情。你首先说C是一个比R更长的元素,而那C你从得到更短的列表 - 你的输入的尾部Ta。无论你在最后的条款(第一条)中如何设置你的R,这都不行。

您希望您的CR,这是开始使用相同的头Ha刚刚通过了测试较短,所以参数只需要放在不同的顺序:

append([Ha], C, R), 

(你可以写出这个更短更简单,但没有任何电话append –它是什么?)。

那么最后的那个(第三,即[])子句呢?如果您拨打teilliste_grK([],3,X)X应该是什么?

+0

我试过'追加(R,哈,R)'这是我想要的但它不会工作。问题是我对Prolog很陌生,来自Java,这是非常不同的。最后一次调用'X'应该是通过递归调用附加的整个列表。 –

+0

好吧,在执行'append([Ha],C,R)后,'它有点不错,但是在R-list上给了我一个空尾,这可能是我的base调用的情况,我会试着去追踪它。但我没有得到追加顺序,我认为第一个参数是我追加第二个参数并将其保存在最后一个参数中的列表。 –

+0

得到了我想要的结果:'teilliste_grK([],_,R): - append([],R).'虽然更多的是通过尝试和错误,然后技能。没有追加的简单方法是什么? –