2014-05-17 1 views
3

방금 ​​Prolog에서 절대 함수를 구현하려고 시도했지만 이상한 행동이 있습니다. 내 코드이었다SWI-Prolog의 물음표 - 비 결정적 functor

absval(X, RESULT) :- X >= 0, RESULT is X. 
absval(X, RESULT) :- X < 0, RESULT is -X. 

을 내가 SWI - 프롤로그 absval(-2,X).에하려고 할 때 예상대로

X = 2 

yes 

를 얻을. 하지만 그렇지 않으면 absval(2,X)을 호출 할 때 X = 2 ?이 발생하고 다른 입력을 삽입해야합니다. enter를 누르면 yes이됩니다.

두 번째 결과는 무엇을 의미합니까? 내 솔루션에 무슨 문제가 있습니까? 당신이 행동과 일치하지 않는보고 무엇을

+2

발생하는 문제는 프로그램이 결정적이지 않다는 사실로 설명 할 수 있습니다. 'absval/2'에는 두 가지 규칙이 있습니다. 따라서 Prolog는 첫 번째 규칙을 사용하여'absval (2, X)'를 만족시킨 후 목표를 다시 달성하기 위해 역 추적합니다. 두 번째 규칙의 첫 번째 부 목적'(X <0)'은 실패하고 두 번째 해결책을 얻지 못할 것입니다. 결정 론적 동작을하기 위해서는'absval (X, RESULT) : -X> = 0,!, RESULT is X '와 같이'X> = 0' 다음에 cut 연산자를 추가하십시오. –

답변

2

는 여기 얻을 : 실제로 무엇을 예상되는 것

?- absval(2,X). 
X = 2 ; 
false. 

.

당신이, 그것은 결정하게 상처를 사용하거나 더 나은해야하는 경우

'의 경우/다음/다른'구성 :

absval(X, RESULT) :- X >= 0 -> RESULT is X ; RESULT is -X. 
+0

괜찮습니다. 추가 질문 : if/then/else 또는 cut을 사용하지 않고 이것을 표현할 수있는 방법이 있습니까? – pt12lol

+0

AFAIK, 아니요. 귀하의 코드는 이미 정확합니다. 비 결정론은 절단하지 않고 피할 수없는 것입니다 ... – CapelliC

+0

아니, 아니, 아니! 표지판을 봐야 해! :-) –

1

하나의 절을 사용하는 결정적 버전의 삭감이 없으면-해당 시점 다른 구성한다 sign/1 내장의 표준 산술 기능이

absolute_value(Value, AbsoluteValue) :- 
    AbsoluteValue is sign(Value) * Value. 

하는 것으로.

+0

'abs'도 있습니다. 나는 여러 가지 펑터를 사용하여 절차 언어에서 if/else 구문을 표현하려고합니다. – pt12lol