Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Prolog-查找已确定长度的所有列表_List_Prolog_Predicate - Fatal编程技术网

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

List Prolog-查找已确定长度的所有列表,list,prolog,predicate,List,Prolog,Predicate,我不熟悉prolog,我想我有一个很容易解决的问题,但我在任何地方都找不到解决方案 所以我有一个列表,我需要找到其中所有元素的长度 这就是我想要的,但它不起作用 averegelist_([[]],[[]]). averegelist_([Wo|List], Averege, NewL):- length(Wo,N), N+1=:=Averege, averegelist_(List, NewL). averegelist([Word|List1],Av, [Word|List2]):-

我不熟悉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-是simbol的列表,X-是此列表中平均长度的单词


分隔符(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).

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

只是为了说明如何使用诸如and-之类的现代库来解决此类问题-

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

看看这张最近的照片,非常感谢。这可能有助于我的思考过程。但是什么是我事先不知道我的情况,不能使它成为事实?如果是在计算过程中计算出来的呢&再次感谢。我做到了@德米特里,太好了!如果您不介意,如果您认为我的答案可以接受,请单击答案旁边的复选标记接受。非常感谢。