List 序言-检查列表是否为空[]

List 序言-检查列表是否为空[],list,prolog,List,Prolog,我只是想弄清楚如何检查列表是否为空,我把一些东西放在一起检查列表的长度,另外还应该检查列表是否为空 % Gives the length of a list. listlength([] , 0 ). listlength([_|Xs] , L ):- listlength(Xs,N), L is N+1. % checks to see that the length of the list is greater than or equal to 3 and n

我只是想弄清楚如何检查列表是否为空,我把一些东西放在一起检查列表的长度,另外还应该检查列表是否为空

% Gives the length of a list.
listlength([]     , 0 ).
listlength([_|Xs] , L ):- 
    listlength(Xs,N), 
    L is N+1. 

% checks to see that the length of the list is greater than or equal to 3 and not empty.
check_length( [] ).
check_length( L  ):-
    listlength(L, Len),
    Len >= 3,
    L \== [].    %This is the bit of code I'm having problems with 
                  it should be false if the list is just [] or empty.

我是一名学生,所以我不需要一个直截了当的答案,我只是想找出我做错了什么

不需要显式测试L是否为空列表;如果长度大于0,则表明


您已经知道如何测试列表是否不为空,因为您在
listLength
中使用了它:
L=[| |]
(也就是说,
L
是一个至少包含1个元素的列表)。

问题是“如何检查列表是否为空”。根据定义,空列表是没有元素的列表,即[]列表。您可以简单地检查您的列表是否与此一致。

如果您的使用范围有限,请选择另一个选项:

%calculate the length
len([],0).
len([_|T],N) :- len(T,X), N is X+1.

%check the length
isEmpty(L) :- len(L,X),X=:=0.
为空(列表):-not(成员(\u,列表))。

它检查给定列表是否有任何成员,并返回该成员的否定值

[]
=>无成员,为空


[foo]
=>成员存在,但不是空的。

对我有用的东西是:


空列表(List):-List=[]。

如果长度>=3,则不能为空;如果为空,则长度为0。您不需要额外的术语。
listLength
不返回任何内容:它试图做出真实的陈述。如果为第二个参数传递一个空列表和一个变量,它会将第二个参数绑定到0。因为您有事实
检查长度([])。
那么
检查长度(L)
如果
L
为空,则成功。但您的意思是,仅当长度大于3时,才希望
检查长度(L)
为真。因此,您需要摆脱事实
检查长度([])。
不使用内置谓词
length/2
有什么特别的原因吗?它必须是最基本的Prolog谓词之一,没有它您无法轻松编写有用的Prolog代码。有了它,
length(List,Len),Len>=3就是你所要做的一切(很抱歉这个直截了当的答案)。检查
L
的长度是否为3的另一种(不可伸缩的)方法是:
L=[[uu,[uuu,[u124;]
,当且仅当
L
的长度为>=3时才是真的。只需说
isEmpty([])。
非常真的假。这就是所谓的工程:)这清楚地表明我仍然是一个新手在序言:)