Prolog 序言逻辑纯度:列表列表列表不为空

Prolog 序言逻辑纯度:列表列表列表不为空,prolog,Prolog,我在序言中遇到了一个问题。我只能在逻辑纯度(大学规则)中使用递归编程 我想检查列表列表中的每个列表是否至少包含一个元素。例如: [[0], [0], [0, s(0), 0], [s(0)]] -> valid [[0], [], [0, s(0), 0], [s(0)]] -> not valid (because of the []) 所以我这样检查: % Auxiliar Method 1 isList([]). isList([_|Tail]) :- isLis

我在序言中遇到了一个问题。我只能在逻辑纯度(大学规则)中使用递归编程

我想检查列表列表中的每个列表是否至少包含一个元素。例如:

[[0], [0], [0, s(0), 0], [s(0)]] -> valid

[[0], [], [0, s(0), 0], [s(0)]] -> not valid (because of the [])
所以我这样检查:

% Auxiliar Method 1

isList([]).
isList([_|Tail]) :-
    isList(Tail).

% Auxiliar Method 2

listLength([], 0).
listLength([_|Tail], NumberOfElements) :-
    listLength(Tail, NumberOfElementsRecursive), 
    NumberOfElements = s(NumberOfElementsRecursive).

% Auxiliar Method 3

moreThan(s(X), 0).
moreThan(s(X), s(Y)) :-
    moreThan(X, Y).

% Real Method

listOfListOfListsNotEmpty([Head|Tail]) :-
    isList(Head),
    listLength(Head, N),
    moreThan(N, 0),
    listOfListOfListsNotEmpty(Tail).
Iteration 1:
    Head: [0]
    Tail: [0], []

    [0] has at least one element? yes

Iteration 2:
    Head: [0]
    Tail: []

    [0] has at least one element? yes

Iteration 3:
    Head: []
    Tail: 

    [] has at least one element? no
我的问题是最后一次迭代。例如,如果要检查此项:

listOfListOfListsNotEmpty([[0], [0]]).
迭代是这样的:

% Auxiliar Method 1

isList([]).
isList([_|Tail]) :-
    isList(Tail).

% Auxiliar Method 2

listLength([], 0).
listLength([_|Tail], NumberOfElements) :-
    listLength(Tail, NumberOfElementsRecursive), 
    NumberOfElements = s(NumberOfElementsRecursive).

% Auxiliar Method 3

moreThan(s(X), 0).
moreThan(s(X), s(Y)) :-
    moreThan(X, Y).

% Real Method

listOfListOfListsNotEmpty([Head|Tail]) :-
    isList(Head),
    listLength(Head, N),
    moreThan(N, 0),
    listOfListOfListsNotEmpty(Tail).
Iteration 1:
    Head: [0]
    Tail: [0], []

    [0] has at least one element? yes

Iteration 2:
    Head: [0]
    Tail: []

    [0] has at least one element? yes

Iteration 3:
    Head: []
    Tail: 

    [] has at least one element? no
我怎么能忽略空列表的最后一个检查??

“对于一些谓词p持有的所有列表元素”,通常使用。因此,这里不需要定义自己的额外谓词

lls_nonempty([]).
lls_nonempty([[_|_]|Ess) :-
   lls_nonempty(Ess).
示例查询:

?- maplist(dif([]), [[0],[0],[0,s(0),0],[s(0)]]). true. ?- maplist(dif([]), [[0],[],[0,s(0),0],[s(0)]]). false. ?映射列表(dif([]),[[0],[0],[0,s(0),0],[s(0)])。 对。 ?映射列表(dif([]),[[0],[0,s(0),0],[s(0)])。 错。
你救了我!!太干净了。万分感谢!!感谢你们大学建立了这么好的校园