2017-12-27 3 views
0

Ich möchte die Anzahl der Elemente vor dem letzten spacebars zählen. Zum Beispiel habe ich eine Liste [a,b,_,_,f,g,h,_,_,_] und das Endergebnis würde X=3.Zählung Elemente vor dem letzten spacebars

last_word(String, Word) :- 
    last_word(String, [], Word). 
last_word([], Word, Word) :- !. 
last_word([' '|TailString], _, Word) :- 
    !, last_word(TailString, [], Word). 
last_word([Char|TailString], Buff, Word) :- 
    last_word(TailString, [Char|Buff], Word). 

dellast([_],[]) :- !. 
dellast([X|T],[X|Y]) :- dellast(T,Y). 

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

count(L,N) :- 
    last(L,Elem), 
    Elem=' ', 
    dellast(L,D), 
    last_word(D,W), 
    num(W,N), !. 
count(L,N) :- 
    last_word(L,W), 
    num(W,N), !. 
+0

'_' sind nicht "spacebars". Sie sind anonyme Variablen, und sie werden mit jedem Prologbegriff vereinheitlichen, ob dieser Begriff eine Variable ist oder nicht. – lurker

+0

Ich denke, sie sollen Leerzeichen sein, unterstreichen nicht. –

+0

@TomasSo ist es an diesem Punkt total spekulativ. – lurker

Antwort

0

Ich gehe davon aus, dass, was Sie wollen dies:

?- count([a,b,' ',' ',f,g,h,' ',' ',' '],N). 
N = 3 

Es gibt verschiedene Probleme in Ihrem Code. Es ist besser, wenn-dann-sonst als spekulative Kürzungen zu verwenden. Sie brauchen Rekursion auch auf der obersten Ebene.

Im folgenden Code ist N die Anzahl der Zeichen im letzten Wort (durch Leerzeichen getrennt) und T ist die Nummer im aktuellen Wort bisher. Anfangs sind sie beide Null.

count(L,N) :- 
    count(L,0,0,N). 

count([C|L],T0,N0,N) :- 
    (C = ' ' -> 
    (T0 = 0 -> 
     N1 = N0, T1 = 0 
    ; N1 = T0, T1 = 0) 
    ; T1 is T0 + 1, N1 = N0), 
    count(L,T1,N1,N). 
count([],_,N,N). 

Also für jeden Charakter gibt es drei Fälle:

  • Nicht Raum: T plus eins
  • ersten Raum nach dem Wort (T Nicht-Null) einstellen N-T
  • Raum & kein aktuelles Wort: nichts

Zugabe: das kann nicht sein, was Sie für die Situation wollen, wenn die Liste mit einem Zeichen endet, aber dann können Sie ein if-then-else im Basisfall auch hinzufügen.

Verwandte Themen