0

次の式があります。

y(t) = x(t) and not x(t-1)
x, y are boolean variables
t is discrete time

これはエッジ検出器です。私はさらにそれを知っています

y(0) = 0
y(1) = 0
y(2) = 1
y(3) = 0
y(4) = 0

と初期条件

x(0) = 1
x(4) = 0

の満足できる値を見つけるために方程式を解きたいと思いますx(1), x(2), x(3)。この例では、解決策の 1 つが次のようになると予想しています。

x(1) = 0
x(2) = 1
x(3) = 1

私はProlog初心者ですが、Prologはまさにこのような課題を解決するのに使えるものだと思います。期待される出力と初期条件を事実として書きます。

y(0,0).
y(1,0).
y(2,1).
y(3,0).
y(4,0).
x(0,1).
x(4,0).

および述語としての方程式self。式を Prolog の述語として書き直す方法と をクエリする方法はx? すべての魂を手に入れることはできますか?すべてのアイデアに感謝します!幸運をお祈りしています。

最初の答えを読んだ後

制約に誤りがあります (この用語をうまく使用すると)。によって刺激される方程式(システム)x(t)は、特定のy(t)

x(t):  1 0 1 0 0
y(t):  X 0 1 0 0
  t :  0 1 2 3 4

whereは、計算のために知る必要があるXため、「わからない」ことを意味します。x(-1)y(0)

x(t)タスクは、t in 1..4いつy(t)が既知 であるかを計算することです。x(0)特定の値を持つかどうかをx(4)要求できます。これはソリューションの数にのみ影響しますが、タスクの本質にとって重要ではないと思います。

与えられた

y(t):  X 0 1 0 0
  t :  0 1 2 3 4 

2つの解決策があります:

S1:
x(t):  1 0 1 0 0
y(t):  X 0 1 0 0
  t :  0 1 2 3 4

S2:
x(t):  1 0 1 1 0
y(t):  X 0 1 0 0
  t :  0 1 2 3 4

の初期/最終制約がない場合x(t)、少なくとも次のソリューションが追加されます。

S3:
x(t):  1 0 1 1 1
y(t):  X 0 1 0 0
  t :  0 1 2 3 4

S4:
x(t):  0 0 1 0 0
y(t):  X 0 1 0 0
  t :  0 1 2 3 4

S5:
x(t):  0 0 1 1 0
y(t):  X 0 1 0 0
  t :  0 1 2 3 4

S6:
x(t):  0 0 1 1 1
y(t):  X 0 1 0 0
  t :  0 1 2 3 4

より長いシリーズとより複雑な方程式についてもこれを解決したいと思います。この例は非常に単純化されています。

4

1 に答える 1

1

ブール変数または有限ドメインに対する制約ソルバーの使用を検討してください。たとえば、SWI-Prolog の場合:

:- use_module(library(clpfd)).

edge(Xs, Ys) :-
        Xs = [X0,X1,X2,X3,X4],
        Ys = [_Y0,Y1,Y2,Y3,Y4],
        Xs ins 0..1,
        Ys ins 0..1,
        X0 = 1,
        X4 = 0,
        Ys = [0,0,1,0,0],
        Y1 #= X1 #/\ Y1 #\= X0,
        Y2 #= X2 #/\ Y2 #\= X1,
        Y3 #= X3 #/\ Y3 #\= X2,
        Y4 #= X4 #/\ Y4 #\= X3.

私は得る:

?- edge(Xs, Ys).
false.

したがって、これを正しく理解してモデル化したと仮定すると、あなたの制約は解決策を認めません。最後の制約をコメントアウトすると、独自の解決策が得られます。

?- edge(Xs, Ys).
Xs = [1, 0, 1, 0, 0],
Ys = [0, 0, 1, 0, 0].

このことから明らかなように、与えられた で最終的な制約を満たすことができないのは明らかY4です。回答にまだ変数がある場合は、すべての具体的なソリューションを列挙するために使用できます (上記の場合ではありません)。Xs00Xslabel/1

于 2013-07-24T11:37:37.767 に答える