我正在尝试创建一个获取列表列表的函数,它返回一个新列表,其中包含原始元素但具有深度的元素。 f.e:
?- function([a,[b,c],d],X).
X = [a,b,c,d]
?- function([[a],[[b]],[c,[d]]],X).
X = [a,b,c,d]
我在手册中找到了以下代码:
function([],[]):- !.
function([H|T],[H|R]):- \+ lst(H), !, function(T,R).
function([H|T],L):- function(H,L1), function(T,L2),
append(L1,L2,T).
不幸的是,它说没有哪个函数lst(H) 另外,我无法理解lst()究竟是做什么并定义它的,因此它是未定义的。
如果有人能够理解如何定义lst,或者只是给我一个关于如何做我正在尝试的选择,我将不胜感激。
答案 0 :(得分:2)
正如Pavel已经说过的那样,在SWI中尝试is_list / 1或者编写自己的简单谓词,如果它的参数是一个列表,则为true。更好的是,编写一个抛出实例化错误的版本,如果顶部列表仍然包含变量,理由是没有足够的信息来做什么:该变量可能稍后被实例化为列表,在这种情况下谓词应该删除嵌套但显然当时没有被召唤。
答案 1 :(得分:1)
在我看来,如果X是一个列表,那么lst(X)应该是真的。在SWI中,等效谓词称为is_list / 1。在你的代码中,+用于否定,但我熟悉\+
。 (啊,我明白了,网站吞下了\
)
编辑:最后一行中的最后一个T应为L:
function([H|T],L):- function(H,L1), function(T,L2), append(L1,L2,L).
我尝试了它,它可以在SWI中使用。