2016-07-26 6 views
1

DLV (Disjunctive Datalog)으로 작업하기 시작했으며 코드를 실행할 때 "규칙이 안전하지 않습니다"오류를보고하는 규칙이 있습니다. 규칙은 다음과 같습니다.DLV 규칙이 안전하지 않습니다.

foo(R, 1) :- not foo(R, _) 

나는 "순환 종속성이 허용되지 않음"을 읽었습니다. 이것이 내가 오류를보고하는 이유라고 생각 합니다만,이 진술이 어떻게 DLV에 문제가되는지 확실하지 않습니다. 최종 목표는 술어가 정의되지 않은 경우 초기화를 수행하는 것입니다.

보다 정확하게, 매개 변수 R (및 다른 것)과 함께 'foo'가 발생하지 않으면 매개 변수 R 및 1로 정의하십시오. 일단 정의되면 규칙이 다시 트리거되지 않아야합니다. 그래서, 이것은 제 의견으로는 진짜 재귀가 아닙니다.

이 문제를 해결하는 방법에 대한 의견을 환영합니다.


필자는 아마도 규칙 본문에서 매개 변수 R과 일치하는 또 다른 조건자를 필요로한다는 것을 깨달았습니다. 이런 식으로 뭔가 : 이후

foo(R, 1) :- not foo(R, _), bar(R) 

, 그렇지 않으면 foo는 전혀 발생 (R, _)이 없습니다 여부를 알 수있는 방법이 없습니다. 내가 나 자신을 분명히했는지 나는 모른다.

어쨌든,이 중 하나를 특정하려면 :(

+1

나는 asp 의미론에서 다소 녹슬지 만 프로그램의 전문화는''foo (dummy, 1) : --foo (dummy, 1)가 아니다 .'' 즉 foo (dummy, 1) is is 확장 기능이 확장 기능에없는 경우 확장 기능에 있습니까? 그 말이 내게 모순 된 것처럼 들린다. –

+0

나는 ASP에 처음 왔지만 몇 년 전에 나는 다른 언어들과 함께 놀았다. 나의 마지막 목표는 아직 정의되지 않은 foo (dummy, 1)를 정의하는 방법을 찾는 것입니다. 내가 DLV에 대해 알고있는 것에서 얻은 나의 인상은 "foo (.)"가 "negation-as-failure"로 간주된다는 것입니다. "foo (.)가 사실이라는 증거가 없거나 다른 말로 "foo (.)가 나타나지 않는다" – rutex

+1

주기성과 부정의 문제는 빈 모델'''{}''''''''foo (_)' ''''{foo (1)}''로 모델을 확장합니다. 그러나 그 규칙을 사용하는 것에 대한 타당성은 무효화됩니다. 2 단계 접근 방법은 어떻습니까? ''bar (1) 줄에있는 것 : - foo가 아닌 (_). bar (X) : - foo (X) .'''. –

답변

1

오류 "규칙은 안전하지 않다"작동하지 않습니다.이 모든 우선 주기적 또는 비 주기적 의존성과 아무 상관이 같은 오류 메시지가 나타난다 비주기적인 프로그램 :

foo2(R, 1) :- not foo(R,_), bar(R). 

문제는 프로그램이 실제로 안전하지 않다는 것이다 (http://www.dlvsystem.com/html/DLV_User_Manual.html#SAFETY) 부정 규칙 (앵커 #의 AEN375 섹션에서 언급 한 바와 같이, I은 2 개 링크를 사용하도록 허용하고 내. 답변) :

Variables, which occur in a negated literal, must also occur in a positive literal in the body.

_이 익명의 변수임을 확인하십시오. 즉,

foo(R,1) :- not foo(R,_), bar(R). 

이 동등로 작성 (및에 해당)

foo(R,1) :- not foo(R,X), bar(R). 

익명 변수 수 (DLV 설명서, 앵커 #의 AEN264이 - 섹션의 끝에서) 프로그램 단지 우리를 수 규칙 내에서 한 번만 발생하는 변수에 대한 이름을 만들지 마십시오 (즉, "가치가 있다고하는 변수, 절대 신경 쓰지 않는 변수)"하지만 변수가 아니라 "부정"이 아닌 부정은 "부정" "진정한 부정"(또는 종종 "부정"이라고도 부르는 "강한 부정")이 아니라 3 가지 안전 조건 중 어느 것도 규칙에 의해 충족되지 않습니다.

안전을위한 매우 거칠고 높은 수준의 직감은 프로그램의 모든 변수가 bar (R)을 추가하여 R의 경우와 같이 일부 유한 도메인에 할당 될 수 있음을 보장합니다. 그러나 익명 변수 _의 경우도 동일해야합니다.

기본값을 정의하는 실제 문제 : lambda.xy에 의해 지적되는.x, 여기서 문제는 DLV의 Answer Set (또는 안정된 모델) 의미입니다. 하나의 규칙으로 시도하면 아무런 해결책도 얻지 못합니다 : 안전한 프로그램을 얻으려면 위의 문제를 대체 할 수 있습니다.

foo(1,2). bar(1). bar(2). 
tmp(R) :- foo(R,_). 
foo(R,1) :- not tmp(R), bar(R). 

하여이 더 안정적인 모델이 없다 : 응답 가정을 의도대로 {foo는 (1,2), 바 (1), 바 (2) foo는 (2,1)} 인 그러나 이것은 tmp (R) : - foo (R, _)가 tmp (2)를 포함해야하기 때문에 유효한 모델이 아닙니다. 그러나 "tmp (2)가 아님"은 더 이상 사실이 아니므로 foo (2,1)를 모델에 포함 시키면 모델의 필요한 최소 성을 위반하게됩니다. (이것은 정확히 무엇이 진행되고 있는지, 거친 직감인지는 모르겠다. 자세한 기술 정보는 answer set 프로그래밍에 대한 기사에서 찾을 수있다. 빠른 검색을 통해이 논문은 첫 번째 결과로 나왔다.

따라서 문제를 해결하기 위해서는 "주기를 깨뜨리는"것이 필요합니다. 하나의 가능성은 다음과 같습니다

foo(1,2). bar(1). bar(2). bar(3). 
tmp(R) :- foo(R,X), X!=1. 
foo(R,1) :- bar(R), not tmp(R). 

즉, 명시 적으로 TMP 모순되지 않는 모델에서 foo는 (2,1)을 가지고, 우리는 하나의 값이 다른 경우에만 중간 원자에 R을 추가 할 것을 주장하여 (2) 아니요도 모델의 일부입니다. 물론 이것은 foo (R, 1)가 디폴트 값으로 존재하는지 입력으로 존재 하는지를 구별하지 못하지만, 필요하지 않다면 ...

또 다른 가능성은 foo를 계산에 사용하지 않는 것입니다. 그러나 일부 foo1 대신. 나는.

foo1(R,X) :- foo(R,X). 
tmp(R) :- foo(R,_). 
foo1(R,1) :- bar(R), not tmp(R). 

그리고 나서 foo 대신 foo1을 사용하십시오.

+0

답변 해 주셔서 감사합니다. 지금 나는 [비슷한 문제] (http://stackoverflow.com/questions/39655922/dlv-list-composition)를 보았고 당신이 도울 수 있는지 궁금해하고있었습니다. 'tmp (R) '트릭을 사용해 보았지만 작동하지 않았습니다. 이것을 사용하면 결과가 비어 있습니다 ... – rutex