2

経時的にバイナリ関数が与えられた場合、この関数で発生する間隔に関する情報を抽出しようとします。たとえば、状態 a と b と次の関数があります。

a, a, b, b, b, a, b, b, a, a

次に、次のような事実間隔(開始、長さ、値)が必要です:

interval(0, 2, a)
interval(2, 3, b) 
interval(5, 1, a) 
interval(6, 2, b) 
interval(8, 2, a)

これが私がこれまでに得たものです:

time(0..9).

duration(1..10).
value(a;b).

1{ function(T, V): value(V) }1 :- time(T).

interval1(T, Length, Value) :- 
    time(T), duration(Length), value(Value),
    function(Ti, Value): Ti >= T, Ti < T + Length, time(Ti).

:- interval1(T, L, V), function(T + L, V).

#show function/2.
#show interval1/3.

これは実際にはうまく機能しますが、まだ正しくはありません。これは、clingo 4.5.4 で実行したときの私の出力です。

function(0,b)
function(1,a)
function(2,b)
function(3,a)
function(4,b)
function(5,a)
function(6,b)
function(7,a)
function(8,b)
function(9,a)
interval1(0,1,b)
interval1(1,1,a)
interval1(2,1,b)
interval1(3,1,a)
interval1(4,1,b)
interval1(5,1,a)
interval1(6,1,b)
interval1(7,1,a)
interval1(8,1,b)
interval1(9,1,a)
interval1(9,10,a)
interval1(9,2,a)
interval1(9,3,a)
interval1(9,4,a)
interval1(9,5,a)
interval1(9,6,a)
interval1(9,7,a)
interval1(9,8,a)
interval1(9,9,a)

これにはバグが 1 つだけあります: T == 9 のすべての区間 (L == 1 の区間を除く)

そこで、それらを取り除くために、次の制約を追加しようとしました。

:- interval1(T, L, V), not time(T + L - 1).

私の考えでは、これは「T + L が時間ではないような間隔を持つことは禁止されている」という意味になります。

だから私は同じことをするはずの別の解決策を試しましたが、少し一般的ではありません:

:- interval1(T, L, V), T + L > 10. 

それはまた、全体を解決不可能にしました。私は本当に理解していませんが、これらのルールの両方が、関数を使い果たした間隔を取り除くだけだと思っています。では、なぜモデルのすべての要素を完全に削除するのでしょうか?

また、実験中に、関数ルールを次のように置き換えました。

function(
    0, a;
    1, a;
    2, b;
    3, b;
    4, b;
    5, b;
    6, a;
    7, b;
    8, a;
    9, a
).

問題のある制約がなくても、全体が満足できないものになるのはなぜですか?

そうですね...私は根本的に何かを誤解していると思います。

よろしくうざく

4

1 に答える 1