2012-05-14 45 views
2

我一直在试图编写一个谓词来评估列表的大小是否均匀,并且这必须在不计算列表长度或任何算术运算的情况下完成。这应该比计算长度更容易,但是我没有考虑如何在没有这个的情况下做到这一点。我猜测是一种递归技术,但如果任何人能够帮助它,那将是非常棒的。Prolog中的大小列表

+1

你有兴趣的甚至长度的列表。 – false

回答

1

我知道这是为时已晚来回答你的问题,但希望这将帮助:

要查找列表中有奇数长度:

oddlength([X]). 
oddlength([X,Y,Z]). 
oddlength([X,Y|R]) :- oddlength(R),!. 

要查找列表中有偶数长度:

evenlength([]). 
evenlength([X,Y|R]) :- evenlength(R),!. 
+1

考虑到您只关心奇数/偶数列表长度,请使用匿名变量作为占位符,除了递归调用的列表尾部之外。 –

+1

我发布了这个答案,但删除它,因为这是一个作业问题。一般来说,不要让人们做他们的功课整个解决方案。他们将复制粘贴。 – keyser

+0

@keyser好的,我是新来的,谢谢你的建议。 –

7

是的,你想要递归。基本情况将是您可以拥有的最小的奇数/偶数列表,然后您只需要弄清楚如何构建递归调用,以便将其归结为基本情况。你可以通过想象一个长度为3的列表开始,它应该为“oddList”返回true。如果它不是基本情况,下一个合乎逻辑的步骤是什么?一个奇怪的清单与一个清单有什么不同?

+1

Prolog中没有功能。 –

+0

@larsmans我们去(编辑) – keyser

+0

+1,好提示。 – sharky

3

保存!只要继续这样的:

evenlength([]).    % smallest list with even length is [] (length=0) 
evenlength([_|Xs]) :- 
    oddlength(Xs). 

oddlength([_|Xs]) :-  % smallest list with odd length is [_] (length=1) 
    evenlength(Xs). 

一些简单的地面evenlength/1和查询oddlength/1

?- evenlength([]). 
true. 
?- oddlength([]). 
false. 

?- evenlength([1]). 
false. 
?- oddlength([1]). 
true. 

?- evenlength([1,2]). 
true.  
?- oddlength([1,2]). 
false. 

?- evenlength([1,2,3]). 
false.  
?- oddlength([1,2,3]). 
true. 

注意,这些断言不仅可以测试候选人名单,同时也生成它们:

?- evenlength(Xs). 
    Xs = [] 
; Xs = [_A,_B] 
; Xs = [_A,_B,_C,_D] 
; Xs = [_A,_B,_C,_D,_E,_F] 
... 

?- oddlength(Xs). 
    Xs = [_A] 
; Xs = [_A,_B,_C] 
; Xs = [_A,_B,_C,_D,_E] 
; Xs = [_A,_B,_C,_D,_E,_F,_G] 
... 
+1

为什么'... size/1'?大小通常意味着包含所有参数的术语大小。 – false

+1

为什么不“evenlength/2”? – false

1

使用foldl/4Prolog lambdas我们需要做的是:

evenlength(Xs) :- 
    foldl(\_^E^O^(O is \E),Xs,1,1). % each item in `Xs` flips the "evenness flag" 

用途示例:

?- evenlength([]). 
true. 

?- evenlength([_]). 
false. 

?- evenlength([_,_]). 
true. 

?- evenlength([_,_,_]). 
false. 

?- evenlength([_,_,_,_]). 
true. 

让我们不要忘记最普通的查询!

?- evenlength(Xs). 
    Xs = [] 
; Xs = [_A,_B] 
; Xs = [_A,_B,_C,_D] 
; Xs = [_A,_B,_C,_D,_E,_F] 
...