(这是 that question 的后续)。
怎么写lead1(Xs,Ys)
这是真的,如果 Ys
是 Xs
的后缀与所有领先 s(s(0))
条款删除。因此,而不是删除领先的 0
这个问题现在是关于去除领先的 s(s(0))
s。
相比原题,难点在于处理s(X)
的案例。和 s(s(X))
适本地。
最佳答案
list_suffix([],[]).
list_suffix([X|Xs],S) :-
if_(X=s(s(0)), list_suffix(Xs,S), S=[X|Xs]).
具有第一个参数的查询确定性地成功:
?- 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))].
如果列表包含不同于 s/1 的术语,例如
f(_)
,则第二个列表与第一个列表相同:?- list_suffix([f(_)],S).
S = [f(_G201)].
?- list_suffix([f(_)],[]).
false.
部分实例化的列表也能工作:
?- 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))).
最一般的查询也能工作,但以不公平的方式列出答案:
?- 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 = [] ;
.
.
.
但是,这可以通过添加目标长度/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 = [] ;
.
.
.
关于prolog - 删除列表中的前导 s(s(0)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39862265/