list - 如何创建会影响子列表的此 prolog 谓词的“深度”版本?
问题描述
我当前的谓词eo
将删除列表中的所有其他元素,从第一个元素开始。
eo([],[]).
eo([_],[]).
eo([_,X|L],[X|R]) :- eo(L,R)].
产生类似的结果
?- eo([a,b,c,d,e,f],L).
L = [b,d,f]
和
?- eo([a,b,c,d,e,f,g],L).
L = [b,d,f]
但现在,我想创建一个“深度”版本。此版本还将影响子列表。所以,以下应该成立:
?- eo([a,b,c,d,e,[x,y,z],L).
L=[b,d,[y]]
不知道该怎么办。
解决方案
所以,以你现在所拥有的,这基本上是你必须做出的改变:
eo([],[]).
eo([_],[]).
eo([_,X|L],[X2|R]) :-
(is_list(X) -> %% is X a list?
eo(X, X2) %% - yes, so recur on it
; X2 = X %% - no, so just pass it through
),
eo(L,R).
推荐阅读
- python - 无法使用 Anaconda 以管理员身份打开 jupyter notebook
- c++ - arduino nano 怎么能容纳这么大的阵列?
- linux - bash aws 命令不会等到完成
- google-cloud-platform - 如何最好地在云 CDN 中提供更大的文件?
- census - 美国州际移民流动
- typescript - TypeScript:如何根据另一个泛型推断一个泛型的类型?
- node.js - 使用 nodejs 访问自定义 HTTP 标头
- r - R如果每行的最大值为负,则将字符串添加到colnames
- css - 对带有 XSLT 的样式表使用相对 href 不适用于 macOS WebView (Xamarin.Forms 5.x)
- python - 你可以直接定义 __doc__ 吗?