답변

2

생성 및 테스트 접근법도 작동합니다. 물론, 당신은 여전히 ​​예를 들어, 몇 가지 제약 조건이 필요합니다

?- between(1, 6, X), % X is an integer between 1 and 6 
    between(1, 6, Y), % Y is an integer between 1 and 6 
    X =< Y,   % X is not larger than Y 
    X + Y =:= 6.  % the sum is 6 
X = 1, Y = 5 ; 
X = 2, Y = 4 ; 
X = Y, Y = 3 ; 
false. 

하위 쿼리의 순서는 중요하다, 당신은뿐만 아니라 생성 - 다음 테스트를 호출 할 수 있도록.

?- between(1, 6, X), % X is an integer between 1 and 6 
    between(X, 6, Y), % Y is an integer between X and 6 
    X + Y =:= 6.  % the sum is 6 
X = 1, Y = 5 ; 
X = 2, Y = 4 ; 
X = Y, Y = 3 ; 
false. 

당신이 아래로가는 것을 깨달아야한다 : 당신은 제약의 일부 하드 코드를 두려워하지 않는 경우, 예를 들어 값의 일부를 발생하지 않도록하고, 시험의 일부가 불필요한 만들 수있는 방법이있을 수 있습니다 그 도로는 CLP (FD)와 같은 구속 조건 해석기를 구현하는 것과 거의 같습니다.

3

내가 사용하는 것이 좋습니다 당신의 프롤로그 그것을 지원, 유한 도메인 솔버.

내가 보통 GProlog를 사용하고 난 당신이 제약 조건을 설정 fd_domain/3이 ( 1에서 100에) 변수에 대한 도메인 AB을 설정

fd_domain([A, B], 1, 100), 
6 #= A + B, 
fd_labeling([A, B]), 

, 6 #= A + B 같은 뭔가 물어 무엇을 얻을 수 있습니다 (A + B 6

입니다 ) 및 fd_labelling/1 모든 가능성 계산을 얻습니다.

Swi-Prolog에서 조금 다릅니다. 모든

첫째, 당신은, 당신은 제약 조건 설정

Vars = [A, B], 
Vars ins 1..100, 

을 쓸 수있는 변수와 도메인을 설정하려면

:- use_module(library(clpfd)). 

와 CLP (FD) 라이브러리를로드 할 필요는 동일

6 #= A + B, 

가능한 모든 조합을 얻으려면

label(Vars),