在最后一个空格键之前计算元素

时间:2017-12-27 21:21:46

标签: prolog

我想计算最后一个空格键之前的元素数量。 例如,我有一个列表[a,b,_,_,f,g,h,_,_,_],最终结果会 X=3

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

1 个答案:

答案 0 :(得分:0)

我认为你想要的是这个:

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

您的代码中存在各种问题。最好使用if-then-else而不是投机性削减。您还需要在顶级递归。

在下面的代码中,N是最后一个单词中的字符数(以空格分隔),T是当前单词中的数字。最初它们都是零。

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

因此,对于每个角色,有三种情况:

  • 不是空格:T加一个
  • 单词后面的第一个空格(T非零):将N设置为T
  • Space&没有当前的词:没什么

另外:当列表以字符结尾时,这可能不是您想要的情况,但是您也可以在基本情况下添加if-then-else。