이런 종류의 일들이 정기적으로 constraint logic programming에서 이루어집니다. 불행히도 나는 더 정확한 세부 사항을 제공하기에는 충분히 경험이 없지만 좋은 출발점이되어야합니다.
일반 원칙은 간단합니다. 언 바운드 변수는 모든 값을 가질 수 있습니다. 불평등에 대해 테스트 할 때 가능한 값 집합은 하나 이상의 간격으로 제한됩니다. 이러한 간격이 단일 지점으로 수렴 될 경우/그 변수는 해당 값에 바인딩됩니다. OTOH가 간격의 모든 값에 대해 불완전한 것으로 간주되면 [프로그래밍] 논리 오류가 발생합니다.
또한 this을 참조하십시오. 실제로 이것이 swi-prolog를 사용하여 수행되는 방법의 예를 참조하십시오. 다행히도 기본 알고리즘에 대한 링크 또는 참조를 찾을 수 있으므로 원하는 플랫폼에서 재현 할 수 있습니다 (어쩌면 기성품 라이브러리를 찾을 수도 있습니다).
업데이트 : swi-prolog 및 clpfd를 사용하여 예제를 재현하려고했지만 예상 한 결과를 얻지 못하고 닫기 만했습니다.
?- [library(clpfd)].
simplify(A,B,C,D) :-
A #= 1 ,
(B #= 1 ; B #\= 0) ,
(C#>= 35 ; D #\= 5) ,
(C#>= 38 ; D #= 6).
그리고 내 결과, (읽기 쉽도록 줄 바꿈 삽입) 역 추적에 : 여기 내 코드는
10 ?- simplify(A,B,C,D).
A = 1,
B = 1,
C in 38..sup ;
A = 1,
B = 1,
D = 6,
C in 35..sup ;
A = 1,
B = 1,
C in 38..sup,
D in inf..4\/6..sup ;
A = 1,
B = 1,
D = 6 ;
A = 1,
B in inf.. -1\/1..sup,
C in 38..sup ;
A = 1,
D = 6,
B in inf.. -1\/1..sup,
C in 35..sup ;
A = 1,
B in inf.. -1\/1..sup,
C in 38..sup,
D in inf..4\/6..sup ;
A = 1,
D = 6,
B in inf.. -1\/1..sup.
11 ?-
그래서, 프로그램은 그 중 8 개 결과를 굴복 2는 5 일 (에 관심 및 8) :
A = 1,
B in inf.. -1\/1..sup,
C in 38..sup ;
A = 1,
D = 6,
B in inf.. -1\/1..sup.
다른 하나는 중복했고, 어쩌면 간단 오토메이션 로직 규칙을 사용하여 제거 할 수 있습니다 :
,691을
1st or 5th ==> 5th [B == 1 or B != 0 --> B != 0]
2nd or 4th ==> 4th [C >= 35 or True --> True ]
3rd or 1st ==> 1st ==> 5th [D != 5 or True --> True ]
4th or 8th ==> 8th [B == 1 or B != 0 --> B != 0]
6th or 8th ==> 8th [C >= 35 or True --> True ]
7th or 3rd ==> 3rd ==> 5th [B == 1 or B != 0 --> B != 0]
나는 그것이 일반적인 솔루션 인 뒤에 긴 방법을 알고 있지만, 내가 말했듯이, 희망이 시작입니다 ...
P.S. clpfd의 것 (#/\
및 #\/
)이 나 자신을 이해할 수없는 매우 이상한 결과를 주었기 때문에 "regular"AND 및 OR (,
및 ;
)을 사용했습니다.
다항식 시간에 얼마나 줄일 수 있는지에 대한 제한이 있습니다. 예를 들어, 결합 표준 형식 식을 가장 간단한 형식으로 항상 줄일 수 있다면 개방형 3SAT 문제를 해결했을 것입니다. – mbeckish
@mbeckish : 그건 나 한테 무섭다. 사실, 당신들이 나를 올바른 방향으로 인도 할 때까지 나는 이런 것들에 대해 몰랐습니다. 나는 3SAT뿐만 아니라 nSAT 문제도 생각하고있었습니다. 이제는 불가능 해 보입니다. –
NP 하드 문제를 해결하는 것을 두려워하지 마십시오. 대부분의 경우, 어려운 부분은 실행 불가능한 문제와 쉬운 문제 사이의 단계 전환에서 문제 공간의 상대적으로 작은 영역에있게됩니다. NP-hard 문제를 해결하는 것이 항상 불가능하다면, 나는 제 일에서 벗어날 것입니다. 알고리즘이 얼마나 확장되는지 기대하는 정도에 따라 다릅니다. – twinterer