2010-11-22 59 views
3

蓄电池Prolog的,我试图解决以下问题,用蓄电池:问题在序言

写谓词addone2 /它的第一个参数是整数列表,并且其第二个参数是通过将第一个列表中的每个整数加1得到的整数列表。例如,查询

 addone([1,2,7,2],X). 

应该给

 X = [2,3,8,3]. 

我创建了下面的代码:

addone([], _). 
addone([E|Tail], [R|Rs]) :- 
    NewE is E+1, 
    append([R|Rs], [NewE], NewRs), 
    addone(Tail, NewRs). 

但它不工作。有人能告诉我为什么吗?那么,如何在Prolog中使用累加器呢?

谢谢!为了NewRs

回答

4

Anthares旅馆连接是,你必须优化您的基本情况是正确的。但是,您也可以通过拨打append来降低效率。在Prolog中,需要一些时间来适应统一的力量,但是例如,在这种情况下,它可以帮助您立即设置结果列表。请尝试以下操作:

addone([E|Tail], [E1|Rs]) :- 
    E1 is E+1, 
    addone(Tail, Rs). 

这就是它的全部。通过立即将E1置于第二个参数的模式中,您已经创建了结果列表的第一个元素。其余元素Rs将在递归期间创建。一个非常典型的Prolog模式。

+0

谢谢你的帮助弗兰克!没有使用列表追加现在没有关于那个“窍门”。还要感谢anthares纠正我的基本情况! – 2010-11-22 09:06:39

+0

谢谢弗兰克!这个技巧根本不明显,非常方便! – ProfVersaggi 2012-03-21 11:43:01

1

你递归的底部应addone([],[]).与[]