2014-11-16 4 views
1

삼각 아이덴티티에 대한 프롤로그 프로그램을 구현 중입니다. 이것은 프로그램의 일부입니다.이전 팩트의 변수에 결과가없는 경우 팩트를 실행하십시오.

simplify_exp(Term1+Term2,X,Y) :- isolaxt(Term1+Term2,Y), 
     (nonvar(Y)-> simplify_exp(Term1,X,Y), simplify_exp(Term2,X,Y)). 

isolaxt(sin(U)^2+cos(U)^2,1). 

나는 (isolaxt 만 실패한 경우) Y 값이없는 경우에만 if 문을 실행합니다. 비록 내가 포함하면 nonvar(Y) 그것은 작동하지 않았다. 어떻게 할 수 있습니까?

답변

0

당신이 가지고있는 유일한 isolaxt 조항이거나 예시로 포함했다면 실제로 얻지 못합니다.

어쨌든 isolaxt이 실패하면 simplify_exp이 실패하고 nonvar(Y)에 도달하지 못합니다. 당신이 기대하는 행동입니까? 아마도 당신과 같이 ;를 사용하는 의미 :

simplify_exp(Term1+Term2,X,Y) :- 
isolaxt(Term1+Term2,Y); (simplify_exp(Term1,X,Y), simplify_exp(Term2,X,Y)). 

이 의미 중 하나 isolaxt 당신이 simplify_exp에 대한 호출을 진행거야을 성공하거나 것입니다.

또한, 어쩌면 당신이 대신 var(Y)을 사용할 것으로 예상, isolaxt이 성공하면 nonvar(Y) 것이다 실패 있습니다.

+0

isolaxt 절에 수식이 포함되었습니다. ';'를 사용했지만 isolaxt가 true이면 simplify_exp를 실행할 필요가 없습니다. 내가 ';' isolaxt가 true이지만 simplify_exp도 실행됩니다. –

+0

아니요, 그렇지 않습니다. 프롤로그에서,'; '를'p (A); 형태로 사용하여 논리적 분리 ("or")를 표현할 때. p (B)'이면,'p (A)'가 성공할 때'p (B)'는 실행되지 않습니다. 사실, q (A, B) : - p (A); p (B)'는'q (A, _) : - p (A) .'와'q (_, B) : - p (B) '두 개의 분리 된 절을 갖는 것과 완전히 동일합니다. – vmg

+0

예. 그것은 작동합니다. 감사. –

관련 문제