2017-12-27 13 views
0

最後のスペースバーの前の要素の数を数えたいと思います。 たとえば、リスト[a,b,_,_,f,g,h,_,_,_]があり、最終結果は X=3となります。あなたのコード内のさまざまな問題がある最後のスペースバーの前の要素をカウントします

?- count([a,b,' ',' ',f,g,h,' ',' ',' '],N). 
N = 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

「_」は「スペースバー」ではありません。それらは匿名の変数であり、プロローグ用語が変数であるかどうかにかかわらず統一されます。 – lurker

+0

彼らはスペース文字ではなく、アンダースコアであると考えています。 –

+0

@トーマスこの時点では完全に投機的です。 – lurker

答えて

0

私が何をしたいことは、このであることを前提としています。投機的なカットよりもif-then-elseを使うほうが良い。トップレベルでも再帰が必要です。

Nは、最後の単語(スペースで区切られた文字)の数で、Tはこれまでの現在の単語の数字です。最初は両方ともゼロです。

  • スペースがありません:Tプラスワン
  • 単語の後
  • まずスペース(Tゼロ以外):設定NT
  • 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). 
    

    だから各文字のために、3例がありますスペース&現在の単語がない:なし

追加:これは、リストが文字で終わったときの状況ではないかもしれませんが、if-then-elseを基本ケースに追加することもできます。

関連する問題