약 정수 프롤로그에, 당신은 당신의 프롤로그 시스템의 CLP (FD) 제약을 사용할 수 있습니다 추론합니다.
Prolog 시스템마다 정확한 세부 사항이 약간 다릅니다. 자세한 내용은 시스템 설명서를 참조하고 관련 질문은 clpfd을 참조하십시오. 귀하의 경우에는
, 우리는 단순히 제약을 게시하여 시작할 수 있습니다
?- 2*X + 3*Y - 5*Z #= 77.
2*X+3*Y#=5*Z+77.
이 경우
, 모든 순수 프롤로그 프로그램으로, 시스템의 대답은 선언적으로 원래의 질의에 해당입니다 . 여기서는 많은 도움이되지 않습니다. 시스템은 원래의 제약 조건을 약간만 재 작성했습니다.
당신은 함께 예를 들어,이 더 제한 할 수 있습니다
요청으로
?- 2*X + 3*Y - 5*Z #= 77,
[X,Y,Z] ins 0..sup.
X in 0..sup,
2*X+3*Y#=5*Z+77,
Y in 0..sup,
Z in 0..sup.
이 추가 목표는 음이 아닌 정수 변수를 제한합니다. 시스템의 대답은 여전히 많은 도움이되지 않습니다.
label/1
을 사용하면 개의 솔루션을 검색 할 수 있습니다. 우리가 시도하는 시간이하지 않는 것이
?- 2*X + 3*Y - 5*Z #= 77,
Vs = [X,Y,Z],
Vs ins 0..sup,
label(Vs).
ERROR: Arguments are not sufficiently instantiated
좋은 소식을 (어떤 의미에서)있다 : 그러나,이 소위 라벨는 모든 도메인이 유한, 그리고 우리가 현재 얻을 것을 요구한다 모두 가능성도 있습니다. 그래서 우리는 검색 공간의 유한 한 부분에 자신을 제한 할 수도 있습니다.예를 들어 :
?- 2*X + 3*Y - 5*Z #= 77,
Vs = [X,Y,Z],
Vs ins 0..10 000 000 000 000 000 000,
label(Vs).
이 쿼리를 사용하면 정수 솔루션으로 콘크리트 얻을 : 당신이 이상 선형 제약을 추론하고 있기 때문에
X = 0,
Y = 29,
Z = 2,
Vs = [0, 29, 2] ;
X = 0,
Y = 34,
Z = 5,
Vs = [0, 34, 5] ;
X = 0,
Y = 39,
Z = 8,
Vs = [0, 39, 8] ;
X = 0,
Y = 44,
Z = 11,
Vs = [0, 44, 11] ;
etc.
을, CLP (Q)도 가치가있을 수있다 시험.
http://docs.sympy.org/latest/modules/solvers/inequalities.html#inequality-docs를 보셨습니까? 나는 결코 그것을 시도하지는 않았지만 그것이 선형 세트의 불평등에 대해 효과가 있어야한다고 생각한다. 숫자 솔루션으로 충분하다면'scipy.optimize.linprog()'를 살펴보십시오. – Dietrich
해결하고자하는 방정식 유형의 예를 게시 할 수 있습니까? – asmeurer
귀하의 의견에 대해 @Dietrich에게 많은 감사를드립니다. 나는 http://stackoverflow.com/questions/40441532/how-to-restrict-sympy-finiteset-containing-symbol/40443339#40443339에 질문을 만날 때까지 그것을 읽는 것을 잊고 있었다. 불평등의 시스템 *을 해결하는 것이 가능하다는 것을 이해하지 못했습니다. –