问题描述
(这是该问题的后续操作).
如何编写lead1(Xs,Ys)
是正确的,如果Ys
是Xs
的后缀,并且所有前导s(s(0))
术语均已删除.因此,这个问题不是删除前导0
,而是现在要删除前导s(s(0))
.
How to write lead1(Xs,Ys)
which is true, iff Ys
is a suffix of Xs
with all leading s(s(0))
terms removed. Thus instead of removing leading 0
s this question is now about removing leading s(s(0))
s.
推荐答案
list_suffix([],[]).
list_suffix([X|Xs],S) :-
if_(X=s(s(0)), list_suffix(Xs,S), S=[X|Xs]).
具有基础第一论点的查询确定性地成功:
Queries with a ground first argument succeed deterministically:
?- 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(_)
第二个列表与第一个相同:
If the list consists of a term different from s/1, say f(_)
the second list is identical to the first:
?- list_suffix([f(_)],S).
S = [f(_G201)].
?- list_suffix([f(_)],[]).
false.
部分实例化的列表也可以工作:
Partially instantiated lists work as well:
?- 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))).
最一般的查询也可以,但是以不公平的方式列出了答案:
The most general query works as well but is listing the answer in an unfair manner:
?- 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前面加上前缀来弥补:
However, this can be remedied by prefixing a goal length/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 = [] ;
.
.
.
这篇关于删除列表中的前导s(s(0))的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!