我是prolog的新手,我正在尝试编写一个规则upToHalfPrefix(A, B)
,如果列表A是列表B的前缀且A的长度不超过B长度的一半,则该规则为真。这是我的尝试:
upToHalfPrefix([A|X], [B|Y]) :-
length([B|Y], N),
length([A|X], K),
TwiceK is K*2,
TwiceK < N,
prefix([A|X], [B|Y]).
但是当我发出查询时:
6 ?- upToHalfPrefix(P, [0,1,2,3,4]).
P = [0] ;
P = [0, 1] ;
ERROR: Out of global stack
......它没有停止。这是什么原因,我怎么能修复它或以不同的方式编写规则?
编辑: 经过一些重新排序后,我有一个修复:
upToHalfPrefix([A|X], [B|Y]) :-
prefix([A|X], [B|Y]),
length([B|Y], N),
length([A|X], K),
TwiceK is K*2,
TwiceK < N.
查询:
9 ?- upToHalfPrefix(P, [0,1,2,3,4]).
P = [0] ;
P = [0, 1] ;
false.
我的怀疑是length([A|X], K)
查询,其中[A | X]是一个输出结果以及K是一个输出结果很麻烦,但我正在寻找更好的解释。