3

リスト要素の連続した重複を排除します。

これに対する私の解決策は次のとおりです。

compress([X,X|Xs], Q) :-
   compress([X|Xs], Q).
compress([X,Y|Xs], Q) :-
   X \= Y,
   compress([Y|Xs], QR),
   append([X], QR, Q).
compress([X|[]], Q) :-
   compress([], QR),
   append([X], QR, Q).
compress([], []).

そして、私は初心者であり、論理パラダイムの経験がないため、改善できる点と、なぜ私の解決策がうまくいかないのかを教えてください.

たとえば、X \= Y私にはきれいに見えません。

4

2 に答える 2

4

@mat (+1) による回答に基づいて、次のようなケースの決定性を改善してみませんか

?- 句(圧縮([a、a、b、b、b、c、c、c、c、d])、Xs)。
Xs = [a、b、c、d] ;
偽

; falseSWI は、目標が決定論的に成功しなかったことを示します。

compression_//2を使用して改善できますif_//3類似物:if_/3

圧縮_([], _) --> [].
compression_([X|Xs], L) -->
   if_ (X = L, % この項目は前の項目と同じですか?
       compression_(Xs, L), % yes: 古い「実行」が続く
       ([X]、compression_(Xs、X)))。% no: 新しい「実行」開始

サンプルクエリ:

?- phrase(compression([a,a,b,b,b,c,c,c,c,d]), Xs).
Xs = [a, b, c, d].                            % succeeds deterministically
于 2016-05-22T17:29:10.757 に答える