fal*_*lse 10 prolog prolog-coroutining
(这是该问题的后续内容).
如何写出lead1(Xs,Ys)哪个是真的,iff Ys是删除Xs了所有主要s(s(0))术语的后缀.因此,0现在的问题不是删除领先者,而是去除领导者s(s(0)).
与原始问题相比,困难在于处理案件s(X)和s(s(X))妥善处理.
list_suffix([],[]).
list_suffix([X|Xs],S) :-
if_(X=s(s(0)), list_suffix(Xs,S), S=[X|Xs]).
Run Code Online (Sandbox Code Playgroud)
具有第一个参数的查询确定性地成功:
?- list_suffix([s(0)],S).
S = [s(0)].
?- list_suffix([s(0),s(s(0))],S).
S = [s(0), s(s(0))].
?- list_suffix([s(s(0)),s(0),s(s(0))],S).
S = [s(0), s(s(0))].
?- list_suffix([s(s(0)), s(s(0)),s(0),s(s(0))],S).
S = [s(0), s(s(0))].
Run Code Online (Sandbox Code Playgroud)
如果列表包含不同于 s/1 的术语,则说f(_)第二个列表与第一个列表相同:
?- list_suffix([f(_)],S).
S = [f(_G201)].
?- list_suffix([f(_)],[]).
false.
Run Code Online (Sandbox Code Playgroud)
部分实例化的列表也能工作:
?- list_suffix([X, s(s(0)),s(0),s(s(0))],S).
X = s(s(0)),
S = [s(0), s(s(0))] ;
S = [X, s(s(0)), s(0), s(s(0))],
dif(X, s(s(0))).
Run Code Online (Sandbox Code Playgroud)
最一般的查询也能工作,但以不公平的方式列出答案:
?- list_suffix(X,Y).
X = Y, Y = [] ;
X = [s(s(0))],
Y = [] ;
X = [s(s(0)), s(s(0))],
Y = [] ;
X = [s(s(0)), s(s(0)), s(s(0))],
Y = [] ;
.
.
.
Run Code Online (Sandbox Code Playgroud)
但是,这可以通过添加目标长度/2 来解决:
?- length(X,_), list_suffix(X,Y).
X = Y, Y = [] ;
X = [s(s(0))],
Y = [] ;
X = Y, Y = [_G155],
dif(_G155, s(s(0))) ;
X = [s(s(0)), s(s(0))],
Y = [] ;
X = [s(s(0)), _G79],
Y = [_G79],
dif(_G79, s(s(0))) ;
X = Y, Y = [_G155, _G158],
dif(_G155, s(s(0))) ;
X = [s(s(0)), s(s(0)), s(s(0))],
Y = [] ;
.
.
.
Run Code Online (Sandbox Code Playgroud)