2012-02-11 2 views
1

와 프롤로그에서 일시 중단 된 목표를 실행하고 나는 붙어하는 방법 : D 내 문제의 요구 사항의 일반적인 버전은 같은 것입니다 :나는 프롤로그 제약 솔버를 사용하여 특정 문제를 해결하기 위해 노력하고 제약

:- lib(ic).:- lib(ic). 
solve([A1*X+B1*Y=C1, A2*X+B2*Y=C2]):- 
X::[0..999], 
Y::[0..999], 
X #\= 0, 
Y #\= 0, 

A1*X+B1*Y#=C1, % line1 
A2*X+B2*Y#=C2. % line2 
(Y = 1 용액이 경우 X = 1)

solve([2*X+3*Y=5, 3*X+2*Y=5]). 

그리고 X와 Y의 값을 계산한다 프로그램 :

는 그리고 이것은 질의/I가 사용하는 목표이다. 목표/쿼리의 인수 수가 달라질 수 있습니다.이 경우 내 프롤로그 프로그램은 % line1 및 % line2로 주석 처리 된 행 대신 동적 중단 목표를 가져야합니다.

질문 : 어떻게 표현을 지연시킬 수 있습니까? 나는이 문제를 어렵게 코드화하고 두 개의 표현식 만 목표를 넘어서고 싶지는 않다고 생각한다.

희망은 분명하다. 감사합니다. .

답변

1

난 당신이 뭔가를 의미 생각 :

:- lib(ic). 

solve([]). 
solve([Eq | Eqs]) :- 
     term_variables(Eq, Vars), 
     Vars :: [0..999], 
     (foreach(Var, Vars) do Var #\= 0), 
     Eq = (Lhs = Rhs), 
     Eq0 = (Lhs #= Rhs), 
     call(Eq0), 
     solve(Eqs). 

ECLiPSe-CLP 특정 코드입니다 주 (물론, 재귀 도우미 술어로 번역 할 수있는 foreach는 루프가와 IC 라이브러리).

또한 call(Eq0)과 쓰기는 단지 Lhs #= Rhs입니다 (afaik). 그러나 Lhs #= Rhs의 변수가 솔버 변수 인 경우에는 그렇지 않습니다. 적어도 몇 달 전에 lib(cplex)을 사용하여 이러한 문제가 발생했습니다.

+0

감사합니다. 나는이 코드 부분을 이해하지 못했다 : Eq0 = (Lhs # = Rhs) 어떻게 작동합니까? 이러한 코딩에 대해 더 많은 것을 읽을 수 있도록 온라인에서 사용 가능한 적합한 자료를 안내해주십시오. 고맙습니다. – kallakafar

+1

@kallakafar : 변수가 값 0을 가질 수 없다는 것을 안다면'Vars :: [1..999]'에 따라 도메인을 설정하고'foreach' 루프를 삭제할 수 있습니다. 'Eq0 = (Lhs # = Rhs)'라인은 변수'Eq0'가 목표'(Lhs # = Rhs)'에 묶여 있지만 목표는 실행되지 않는다는 것을 의미합니다. 다음 행'call (Eq0)'에서만 실행됩니다. 'Lhs # = Rhs'를 쓰는 것의 문제는 IC 라이브러리에서 변수 만 허용되며 복잡한 용어는 허용되지 않는다는 것입니다. 귀하의 경우,'Lhs'는 용어이므로'eval/1'에'eval (Lhs) # = Rhs'로 묶어야합니다. – twinterer

+0

@kallakafar : ECLiPSe에 대한 설명서는 http://www.eclipseclp.org/doc/userman/umsroot.html 및 여기 http://www.eclipseclp.org/doc/libman/libman에서 온라인으로 볼 수 있습니다. html. ECLiPSe 설치와 함께 두 설명서를 모두 받아야합니다. Helmut Simonis의 e- 러닝 강좌가 있습니다 : http://4c.ucc.ie/~hsimonis/ELearning/index.htm 및 ECLiPSe 자습서 소개 : http://www.eclipseclp.org/doc/tutorial/index. html. 마지막으로 사용자 메일 링리스트에서 ECLiPSe에 대해 질문하십시오. https://lists.sourceforge.net/lists/listinfo/eclipse-clp-users – twinterer

관련 문제