如何比较列表长度Prolog

时间:2014-12-21 03:13:37

标签: prolog

我是Prolog的新人,我正在尝试解决一些练习,如果列表L2的长度是列表L1的两倍,我发现这个练习成功了两次_(长,L2)。

不要计算列表的长度。

twice_as_long([],[]).
true.

?- twice_as_long([a],[1,2]).
true.

?- twice_as_long([a,b],X).
X = [_G328, _G331, _G334, _G337] ;
false

我想要一些提示,因为我不想像他们所说的那样比较长度。

2 个答案:

答案 0 :(得分:1)

我们可以将您的第二个示例概括为:

twice_as_long([_],[_,_]).

但我们可以做得更好:

twice_as_long([_|T1], [_,_|T2]) :- twice_as_long(T1,T2).

根据你的第一个例子的基本情况,这将完成这项工作。

答案 1 :(得分:0)

关于Prolog惯例,给出type_of_relationship(X,Y)形式的谓词,按照

的方式将其视为事实陈述是非常习惯的。
  

X type_of_relationship Y

所以,让我们按照参数的顺序翻转:twice_as_long(X,Y)断言X Y两倍

考虑到这一点,并放大了@ScottHunter的答案,让我们把事情分解成简单的案例。

首先,您的示例显示了一个应该失败的案例。

twice_as_long([],[]).

断言空列表的长度是其自身的两倍,这显然是不真实的:空列表的长度为零,两次零值仍为.zero。所以应该抛弃这种情况。

然而,最简单的情况是:

twice_as_long( [_,_] , [_] ) .

一个断言,长度为2的列表是长度为1的列表的两倍。

然后,有一般情况:

twice_as_long( [_,_|Xs] , [_|Ys] ) :-
  twice_as_long(Xs,Ys) .

其中我们说两个或更多项目的列表是一个或多个项目列表的两倍......

IF ,第一个列表的剩余部分是第二个列表的剩余部分的两倍,其中剩余部分是通过从第一个列表中删除前2个项目而从中删除1个项目第二个清单。

这给了我们这个解决方案:

twice_as_long( [_]    , [_,_]    ) .
twice_as_long( [_|Xs] , [_,_|Ys] ) :- twice_as_long(Xs,Ys) .

当您到达简单的基本情况时,谓词将成功,否则将失败。