Prolog - 找到所有已确定长度的列表

Prolog - find all lists that have established length

我是 prolog 的新手,我想我有一个非常容易解决的问题,但我无法在任何地方找到解决方案。

所以我有一个列表列表,我需要在其中找到所有具有确定长度的元素。

这就是我的目的,但它不起作用。

averegelist_([[]],[[]]).
averegelist_([Wo|List], Averege, NewL):-
    length(Wo,N), N+1=:=Averege, averegelist_(List, NewL).
averegelist([Word|List1],Av, [Word|List2]):-  
    length(Word,N), N+1=\=Av, averegelist_(List1, Av, List2).

我期望的是这样的:

?- averegelist([['a','b','c'],['f','g'],['h','m']],2, X)).
X = ['f','g'].
X = ['h','m'].  
False

有人可以帮帮我吗?

编辑:

所以,我做到了!对于任何对此主题感兴趣的人,这就是我的代码:

split_on_delimiter(L, D, S) :-
    split_on_delimiter_(L, D, R),
    findall(X, (member(X, R), length(X,Length), Length > 0), S).

split_on_delimiter_([], _, [[]]).    
split_on_delimiter_([D|T], D, [[]|T2]) :-
    split_on_delimiter_(T, D, T2).
split_on_delimiter_([H|T], D, [[H|T2]|T3]) :-
    dif(H, D),
    split_on_delimiter_(T, D, [T2|T3]).

my_length([],0).
my_length([_|L],N) :- my_length(L,N1), N is N1 + 1.

my_length_lol([], 0).
my_length_lol([H|L],N) :- my_length(H,Add), my_length_lol(L,N1), N is N1 + Add.

countAver(L,Av):- length(L,ListN), my_length_lol(L,AllN), Av is div(AllN,ListN).

test_condition(X, Con):- length(X, N), N =:= Con.

select_element_on_condition([X|Xs], X, Con) :-
    test_condition(X, Con).
select_element_on_condition([_|Xs], X, Con) :-
    select_element_on_condition(Xs, X, Con).

findAvWord(L, X):- split_on_delimiter(L,' ', Words), countAver(Words, AvWordLength), 
    write(AvWordLength), select_element_on_condition(Words, X, AvWordLength).

findAvWord(L, X) L - 是符号列表,X - 是此列表中平均长度的单词。

split_on_delimiter(L,D,S) S 是 - 来自 L 的列表列表,基于定界符(在我的例子中为' ')

我认为你让这个问题变得比实际更难了。这是一个简单的谓词框架,它对满足特定条件的列表元素成功。您应该能够根据您的问题进行调整。

select_element_on_condition([X|Xs], X) :-
    test_condition(X).
select_element_on_condition([_|Xs], X) :-
    select_element_on_condition(Xs, X).

在你的例子中,你的元素是列表,测试条件是长度。

只是为了展示如何使用 apply and yall 等现代库解决此类问题 - 如果可用 -

averegelist(Lists, Length, ListsOfLength) :-
  include({Length}/[List]>>length(List,Length), Lists, ListsOfLength).