2016-12-21 4 views
1

시간이 지남에 따라 이진 함수가 주어지면이 함수에서 발생하는 간격에 대한 정보를 추출하려고합니다. 예.간격 정보 생성 문제

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) 

내가 지금 무엇을 가지고있다 나는 상태 A와 B, 다음과 같은 기능을 가지고 지금까지 :

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와 함께 실행할 때 여전히 제대로 수행하지 않는이 내 출력은 다음과 같습니다

,369 하나의 버그가 1,363,210
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) 

:

그래서 나는 다음과 같은 제약 조건을 추가하려고 (L == 1이 하나 제외) T의 == 9 전혀 간격, 그 없애 :

내 마음에서하는 변환
:- interval1(T, L, V), not time(T + L - 1). 

"가 금지되고, T + L은 시간이되지 않도록, 간격을 가지고"하지만 지금 clingo 문제가 시켰음이 될 것이라고 말했다.

그래서 동일한 작업을 수행해야 다른 솔루션을 시도했지만 좀 덜 일반적인 방법 : 또한 모든 일이 해결 못하는 만든

:- 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 
). 

:

또한, 내 실험을하는 동안, 나는와 함수 규칙을 대체?

그래 ... 나는 근본적으로 뭔가를 놓친 것이고 누군가가 내게 정확히 무엇이 있는지 말해 준다면 정말 좋을 것 같습니다. 제약

안부 Uzaku

답변

1

프로그램은 때문에 사실 a.:-a.이 일치하지 않는 제약을 모두 포함하는 프로그램 ASP에 일치하지 않습니다. 기본적으로 a이 true라고 말하면서 동시에 a은 사실 일 수 없습니다.

예를 들어, 어떤 함수에서는 interval1(9,10,a)이 참임을 나타내는 규칙이 있으며, 반면에 interval(9,10,a)이 참일 수 없다는 제약 조건이 있으므로 불일치가 발생합니다.

원하지 않는 간격을 없애는 방법은 예를 들어 간격의 정의에 여분의 원자를 추가하는 것입니다.g :

interval1(T, Length, Value) :- 
    time(T), duration(Length), value(Value), 
    time(T+Length-1), % I added this 
    function(Ti, Value): Ti >= T, Ti < T + Length, time(Ti). 

이제 프로그램의 일관성이 유지되었습니다.

제공 한 특정 기능에 대한 불일치를 재현 할 수 없습니다. 이것은 내가 출력에 무엇을 얻을

time(0..9). 

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

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

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


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


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

: 나를 위해, 다음 사항이 일치 그들 중 일부는 최대 아니기 때문에,

$ clingo test 0 
clingo version 4.5.4 
Reading from test 
Solving... 
Answer: 1 
function(0,a) function(1,a) function(2,b) function(3,b) function(4,b) function(5,b) function(6,a) function(7,b) function(8,a) function(9,a) interval1(0,1,a) interval1(1,1,a) interval1(0,2,a) interval1(6,1,a) interval1(8,1,a) interval1(9,1,a) interval1(8,2,a) interval1(2,1,b) interval1(3,1,b) interval1(2,2,b) interval1(4,1,b) interval1(3,2,b) interval1(2,3,b) interval1(5,1,b) interval1(4,2,b) interval1(3,3,b) interval1(2,4,b) interval1(7,1,b) 
SATISFIABLE 

Models  : 1  
Calls  : 1 
Time   : 0.002s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s) 
CPU Time  : 0.000s 

우리는 필요한 것보다 더 간격을 받고 있지만, 나는 당신이 생각할 수 있도록 이것을 남겨주세요 :)

희망이 도움이됩니다.

+0

안녕하세요, 답변 해 주셔서 감사합니다. interval1의 정의에서 제안한 한 줄만 추가하면 문제가 해결됩니다. 하지만 첫 번째 제약 조건은 ": - interval1 (T, L, V), function (T + L, V)"입니다. 그렇다면 이것이 왜 불일치를 유발하지 않는가? – Uzaku

+0

자, 방금 규칙 대신 손으로 함수를 정의하면 제약 조건이 작동하지 않아서 불일치가 발생한다고 언급했습니다. 나는 interval의 정의로 constraint를 옮겼는데, "not function (T + Length, Value)"를 추가했다. "다음 요소가 interval과 같은 값일 때 interval이 없다"고 말해야한다. 간격 (0, 2, a) 및 간격 (1, 1, a)을 생성합니다. 그게 왜? – Uzaku

+0

NVM은 방금 전방에서 너무 길다는 사실을 깨달았습니다. 그래서 "기능 (T - 1, Value)이 아닌"기능을 정의에 추가함으로써 이제는 원하는 바를 갖게되었습니다. 다시 한 번 감사드립니다 :) – Uzaku