Prolog:为什么这个查询没有终止?

时间:2018-04-17 22:26:10

标签: prolog

我是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是一个输出结果很麻烦,但我正在寻找更好的解释。

0 个答案:

没有答案