我是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
我想要一些提示,因为我不想像他们所说的那样比较长度。
答案 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) .
当您到达简单的基本情况时,谓词将成功,否则将失败。