我正在尝试在Prolog中定义一个谓词
我的方法是取
我已经编写了帮助谓词
我的代码如下:
sublist(X,Y)
,当列表X
的元素按照与X
中相同的顺序出现在列表Y
中时为真。我的方法是取
X
的头部,在Y
中找到第一个实例,然后在该实例之前将列表切断,然后重复这个过程直到尾部等于空列表。我已经编写了帮助谓词
cut(X,Y,Z)
,如果Z
是在列表Y
中切掉X
之前的所有内容所得到的列表,则为真。我的代码如下:
cut(_,[],[_|_]) :- false.
cut(X,[H|T],[H|T]) :- X = H, !.
cut(X,[_|T],Y) :- cut(X,T,Y).
sublist([],[]).
sublist([],[_|_]).
sublist([A|B],C) :- cut(A,C,Z), sublist(B,Z).
当我查询时
?- sublist(L,[1,2,3]).
与其给出[1,2,3]
的所有子列表,Prolog会给我以下输出:
L = [] ;
L = [1] ;
L = [1, 1] ;
L = [1, 1, 1] ;
L = [1, 1, 1, 1] ;
L = [1, 1, 1, 1, 1] ;
L = [1, 1, 1, 1, 1, 1] ;
L = [1, 1, 1, 1, 1, 1, 1] ;
L = [1, 1, 1, 1, 1, 1, 1, 1] ;
L = [1, 1, 1, 1, 1, 1, 1, 1, 1] ;
L = [1, 1, 1, 1, 1, 1, 1, 1, 1|...] ;
L = [1, 1, 1, 1, 1, 1, 1, 1, 1|...] ;
L = [1, 1, 1, 1, 1, 1, 1, 1, 1|...]
我没看出我的错误在哪里,有人能给我指出来吗?
cut(_,[],[_|_]) :- false.
只要它不存在,查询看起来像cut(_,[],[_|_]).
的将会失败,因为它不匹配一个成功的规则。你尝试过使用trace
吗?或者你只是尝试测试cut/3
本身吗?你创建cut/3
而不是使用select/3
有什么原因吗? - lurker