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)])。
错。
你救了我!!太干净了。万分感谢!!感谢你们大学建立了这么好的校园