prolog - 删除列表中的前导 s(s(0))

标签 prolog prolog-coroutining

(这是 that question 的后续)。

怎么写lead1(Xs,Ys)这是真的,如果 YsXs 的后缀与所有领先 s(s(0))条款删除。因此,而不是删除领先的 0这个问题现在是关于去除领先的 s(s(0)) s。

相比原题,难点在于处理s(X)的案例。和 s(s(X))适本地。

最佳答案

这是带有 if_/3=/3 的版本:

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/

相关文章:

prolog - 在序言中卡住目标

Prolog - 如果条件 1 AND 条件 2 执行 x

vb.net - Prolog 连接到 vb.net

prolog - 序言中的保护条款?

prolog - SWI-Prolog : How to use my own predicate as a condition in when/2

python - 如何从 swi-prolog 中执行的 python 脚本获取输出值

list - Prolog - 将列表分成两半,反转前半部分

list - Prolog 压缩列表

prolog - 关于混合 Prolog 协程(freeze/2,when/2)和 DCG