Prolog 不带深度的列表列表列表

Prolog 不带深度的列表列表列表,prolog,Prolog,我试图创建一个函数,它接受一个列表列表,然后返回一个新列表,其中包含原始列表的元素,但没有深度。 f、 e: 我在一本手册中发现了以下代码: 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)是什么。 另外,我无法理解

我试图创建一个函数,它接受一个列表列表,然后返回一个新列表,其中包含原始列表的元素,但没有深度。 f、 e:

我在一本手册中发现了以下代码:

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应该如何定义,或者只是给我一个关于如何做我正在尝试的事情的替代方案,我将不胜感激。

在我看来,如果X是一个列表,那么lst(X)应该是真的。在SWI中,一个等价谓词称为is_list/1。在您的代码中,+用于否定,但我熟悉
\+
。(啊,我明白了,网站吞下了
\

编辑:最后一行中的最后一个T应为L:

function([H|T],L):- function(H,L1), function(T,L2), append(L1,L2,L).

我试过了,它在SWI中工作。

正如Pavel已经说过的,在SWI中尝试is_list/1,或者编写自己的简单谓词,如果它的参数是列表,则为true。更好的方法是,编写一个版本,如果顶部列表仍然包含变量,则会引发实例化错误,原因是没有足够的信息来执行该操作:该变量可能稍后被实例化为列表,在这种情况下,谓词应该删除嵌套,但在调用时显然无法删除。

thnx对于提示,我试图用is_列表替换它,但不幸的是,我一直得到的唯一结果是“false”。我猜代码一定是在其他地方出错。.is_列表不起作用,而且我恐怕对prolog来说太新了,无法编写符合您描述的代码。.但无论如何,thnx!
function([H|T],L):- function(H,L1), function(T,L2), append(L1,L2,L).