列表列表没有深度列出

时间:2011-01-04 15:25:28

标签: prolog

我正在尝试创建一个获取列表列表的函数,它返回一个新列表,其中包含原始元素但具有深度的元素。 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,或者只是给我一个关于如何做我正在尝试的选择,我将不胜感激。

2 个答案:

答案 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中使用。