2017-03-12 2 views
0

Ich bin neu in Prolog, und ich denke, ich habe ein wirklich einfaches Problem zu lösen, aber ich kann nirgendwo Lösung finden.Prolog - finde alle Listen, die eine feste Länge haben

Also habe ich eine Liste von Listen und ich muss alle Elemente darin mit etablierter Länge finden.

Dies ist, was ich kam, aber es funktioniert nicht.

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

Was erwartet i somethig wie folgt aus:

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

Kann mir jemand bitte helfen?

Edit:

Also, ich habe es geschafft! Für alle Interessierten in diesem Topik ist das, was mein Code wie folgt aussieht:

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 - eine Liste von simbols ist, X - ein Wort von averege Länge in dieser Liste.

split_on_delimiter (L, D, S) S - Liste von Listen von L, bezogen auf Trennzeichen (‘ 'in meinem Fall)

+0

Werfen Sie einen Blick auf diese letzten [Q & A] (http://stackoverflow.com/q/42737638 1243762). –

Antwort

1

Ich denke, du machst dieses Problem schwieriger, als es wirklich ist. Hier ist ein einfaches Prädikat-Framework, das für Listenelemente erfolgreich ist, die bestimmte Kriterien erfüllen. Sie sollten dies an Ihr Problem anpassen können.

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

In Ihrem Fall sind Ihre Elemente Listen, und die Testbedingung ist für die Länge.

+0

Vielen Dank. Es könnte meinem Denkprozess helfen. Aber was weiß ich vorher nicht und kann es nicht machen? Was ist, wenn es im Prozess berechnet wird & –

+1

Vielen Dank nochmal. Ich habe es gemacht! –

+0

@ Sar.Dmitry das ist großartig! Wenn es Ihnen nichts ausmacht, wenn Sie meine Antwort akzeptabel finden, akzeptieren Sie sie, indem Sie auf das Häkchen neben der Antwort klicken. Vielen Dank! – lurker

0

nur um zu zeigen, wie ein solches Problem mit modernen Bibliotheken lösen wie apply und yall - sofern vorhanden -

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