2

私は現在、[0,1] *の形式のリストを取り、リスト内の'の数が'の数より大きいかどうかを通知するを作成しています。3番目の部分( )を機能させることができないようです。031dcg//0

 sq --> [].
 sq --> num, sq.

 num --> [0].
 num --> [1].

 dcg --> sq, dd(Count), Count > 2.

 dd(0) --> [].
 dd(Newcnt) --> [0], dd(Cnt), { Newcnt is Cnt+1 }.
 dd(Newcnt) --> [1], dd(Cnt), { Newcnt is Cnt-1 }.
4

3 に答える 3

1

@Little Bobby Tables による回答は、要素数を合成 (カウント) し、DCG の「外側」で結果をテストする必要があります

..., phrase(sq(Z,O), S), Z is O*3, ...

より簡単な方法は、不均衡を伝えることです

z3o1(B) --> [1], {S is B-3}, z3o1(S).
z3o1(B) --> [0], {S is B+1}, z3o1(S).
z3o1(0) --> [].  % accept only if balanced

..., phrase(z3o1(0), S), ...
于 2012-11-28T09:57:56.900 に答える
1

もうすぐです...実際、コードはそこにあります。使用してみましょう!

:- use_module(library(clpfd)).

実行dd//1すると、次のphrase/2ようになります。

?- C #>= 3, phrase(dd(C), Xs).
   C = 3, Xs = [0,0,0]
;  C = 4, Xs = [0,0,0,0]
;  C = 5, Xs = [0,0,0,0,0]
;  C = 6, Xs = [0,0,0,0,0,0]
;  C = 7, Xs = [0,0,0,0,0,0,0]
;  C = 8, Xs = [0,0,0,0,0,0,0,0]
;  C = 9, Xs = [0,0,0,0,0,0,0,0,0]
...

を含むシーケンスはどこにあります1か? 私たちはそれらが存在しなければならないことを知っています...

?- Xs = [0,0,0,1,0], C #>= 3, フレーズ(dd(C), Xs).
   Xs = [0,0,0,1,0]、C = 3
; 間違い。

...しかし、それらは上記の回答シーケンスには表示されません。

?- C #>= 3, 句(dd(C), Xs), Xs = [0,0,0,1,0].
**ループ**

length/2ソリューション セットの公平な列挙を強制するために、次のような目標を使用できます。

?- C #>= 3、長さ(Xs, _)、語句 (dd(C), Xs)。
   C = 3、Xs = [0,0,0]
; C = 4、Xs = [0,0,0,0]
; C = 5、Xs = [0,0,0,0,0]
; C = 3、Xs = [0,0,0,0,1]
;  C = 3、Xs = [0,0,0,1,0]
; C = 3、Xs = [0,0,1,0,0]
; C = 3、Xs = [0,1,0,0,0]
; C = 3、Xs = [1,0,0,0,0]
; C = 6、Xs = [0,0,0,0,0,0]
...
于 2016-01-15T10:22:53.073 に答える
0

次のコードは、指定されたシーケンス内の 0 と 1 の数をカウントします。これを使用して、必要な条件を適用できます。

sq(0, 0) --> [].
sq(Zeros, Ones) -->
    [0], 
    sq(Z, Ones), 
    {Zeros is Z + 1}.
sq(Zeros, Ones) -->
    [1], 
    sq(Zeros, O),
    {Ones is O + 1}.
于 2012-11-28T07:19:08.343 に答える