2

Llistと numberを取得し、 が listの最長シーケンスの長さであるN場合に trueになる述語を作成したいと考えています。例えば:NL

?- ls([1,2,2,4,4,4,2,3,2],3).
    true.

?- ls([1,2,3,2,3,2,1,7,8],3).
    false.

このために私は構築しました -

head([X|S],X). % head of the list
ls([H|T],N) :- head(T,X),H=X, NN is N-1 , ls(T,NN) . % if the head equal to his following
ls(_,0) :- !. % get seq in length N
ls([H|T],N) :- head(T,X) , not(H=X) ,ls(T,N). % if the head doesn't equal to his following

概念は単純です - 頭が彼の次と等しいかどうかをチェックし、そうであれば、尾を続けて を減らしますN

私は自分のコードをチェックし、それはうまく動作します (ケースを無視しますN = 1) -

 ls([1,2,2,4,4,4,2,3,2],3).
true ; 
false . 

しかし、true答えは有限ではなく、その後にさらに答えがあります。どうすれば有限の答えを返すことができますか?

4

3 に答える 3

2

最後のルールにブレークを追加してみませんか?

head([X|S],X). % head of the list
ls([H|T],N) :- head(T,X),H=X, NN is N-1 , ls(T,NN) .    % if the head equal to his following
ls(_,0) :- !.                                           % get seq in length N
ls([H|T],N) :- head(T,X) , not(H=X) ,ls(T,N),!.         % if the head doesn't equal to his following

私はPrologの専門家ではありませんが、私にとってはうまくいきます。

//編集:ところで。試す

14 ?- ls([1,2,2,4,4,4,2,3,2],2).
true ;
false.

私には間違っているように見えます。Nが最長のシーケンスであるかどうかのチェックはありません。または、要件を間違えましたか?

于 2013-02-28T00:55:37.430 に答える
2

あなたのコードは、指定された長さの要素のシーケンスが少なくともリストにあるかどうかをチェックしています。リストにアクセスしている間、検索の状態を維持するには、さらに引数が必要です。

ls([E|Es], L) :- ls(E, 1, Es, L).

ls(X, N, [Y|Ys], L) :-
  (  X = Y
  -> M is N+1,
     ls(X, M, Ys, L)
  ;  ls(Y, 1, Ys, M),
     ( M > N -> L = M ; L = N )
  ).
ls(_, N, [], N).
于 2013-02-28T08:01:12.687 に答える