我想计算最后一个空格键之前的元素数量。
例如,我有一个列表[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), !.
答案 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
另外:当列表以字符结尾时,这可能不是您想要的情况,但是您也可以在基本情况下添加if-then-else。