2017-03-12 64 views
0

我是新來的Prolog,我覺得我有一個非常簡單的問題來解決所有的列表,但我無法找到任何地方sollution。序言 - 發現已經建立了長度

所以我有一個列表的列表,我需要找到它與esteblished長度的所有元素。

這就是我來的,但它不工作。

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). 

我期望是什麼somethig這樣的:

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

有人可以幫助我,好嗎?

編輯:

所以,我做到了!對於任何有興趣在此TOPIK這是我的代碼如下所示:

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 - 是simbols名單,X - 在此列表averege長的一個字。

split_on_delimiter(L,d,S)S是 - 從l列出,基於分隔符的列表(」'在我的情況)

+0

在這最近的[Q&A](http://stackoverflow.com/q/42737638看看/ 1243762)。 –

回答

1

我認爲你正在做這個問題的難度比它確實是。以下是一個簡單的謂詞框架,它能夠滿足特定條件的列表元素。你應該能夠適應你的問題。

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

在你的情況下,你的元素是列表,測試條件是長度。

+0

非常感謝。這可能有助於我的思考過程。但是,我以前不知道自己的狀況,因此無法將其作爲事實?如果在計算過程中計入& –

+1

再次感謝您。我做的! –

+0

@ Sar.Dmitry太棒了!如果您不介意,如果您發現我的答案可以接受,請點擊答案旁邊的複選標記以表示接受。謝謝! – lurker

0

只是爲了說明如何使用現代化圖書館像applyyall解決這樣的問題 - 如果有的話 -

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