2014-05-25 1 views
2

에 나는를 arithmetics에 대한 프롤로그에서 조건을 평가 쓰고 싶다 나는 this을 발견 : 매우 DRY 큰 것이 아니라DRY 연산 식의 평가는 프롤로그

eval(A+B,CV):-eval(A,AV),eval(B,BV),CV is AV+BV. 
eval(A-B,CV):-eval(A,AV),eval(B,BV),CV is AV-BV. 
eval(A*B,CV):-eval(A,AV),eval(B,BV),CV is AV*BV. 
eval(Num,Num):-number(Num). 

합니다.

는 또한 this을 발견했습니다

:- op(100,fy,neg), op(200,yfx,and), op(300,yfx,or). 

positive(Formula) :- 
    atom(Formula). 

positive(Formula) :- 
    Formula =.. [_,Left,Right], 
    positive(Left), 
    positive(Right). 

?- positive((p or q) and (q or r)). 
Yes 
?- positive(p and (neg q or r)). 
No 

운영자가 여기 _과 일치하고 인수가 왼쪽과 오른쪽으로 일치합니다.

그래서 나는이 함께했다 : 그것은 작동하지만 대신 Syntax error: Operator expected을 제공하는 경우에만

eval(Formula, Value) :- 
    Formula =.. [Op, L, R], Value is Op(L,R). 

그것은 지옥으로 건조 될 것이다.

그런 경우에 Prolog가 인수에 연산자를 적용하는 방법이 있습니까?

답변

3

귀하의 거의 DRY 솔루션은 여러 가지 이유로 작동하지 않습니다

  • Formula =.. [Op, L, R]

    는 이항 연산자에만 의미합니다. 당신은 확실히 숫자를 참조하기를 원합니다.

  • 인수 LR은 전혀 고려하지 않았습니다.

  • Op(L,R)은 유효한 프롤로그 구문입니다. positive/1가 실패하고 실패보다 적어도 더 eval/2 루프 것입니다 반면, 플러스 측에

, 당신의 시도는 변수에 대한 깨끗한 인스턴스화 오류가 발생합니다.

운영자가 실질적으로 (is)/2에서 사용하는 것과 동일하기 때문에 먼저 확인하고 다시 사용하려는 경우 (is)/2을 다시 사용하십시오.

가변적으로 많은 실수를 유발하는 변수에 대해 number/1이 실패합니다. 안전한 대안은

t_number(N) :- 
    functor(N,_,0), 
    number(N). 
+1

감사합니다. 모든 작업을 수행하기 위해 (2)/2를 사용하는 것이 좋습니다. 변수를 처리하기 위해 약간 확장해야하지만 문제가되어서는 안됩니다. :) – Legat