2011-01-26 2 views

답변

8

이 프롤로그의 경우 - 당시 다른 구조의 "숨겨진"커트있다 : 당신이 제대로 술어를 작성하는 경우 절단이 필요하므로, 되돌아은 성공할 수 없다 그것은 기발한 것이지만, Prolog는 if-then 또는 if-then-else 구문의 "전제"를 형성하는 부 목적을 되돌아 가지 않습니다. 여기서 X < 0이 첫 번째 시도를 성공하면 "else"절이 "then"절의 선택이 커밋됩니다 (따라서이 동작을 "숨겨진"컷으로 설명).

술어 질문에 작성된 ABS2/2 절에 컷의 역할의 더 있습니다. 니콜라스 (Nicholas)가 지적했듯이, 두 번째 절의 끝 부분에있는 컷은 효과가 없습니다 (거기에 도착할 때 남겨진 선택 점이 없습니다). 그러나 Kaarel이 지적했듯이 첫 번째 절이 성공하면 선택 지점이 열려 있습니다.

abs2(X,X) :- X >= 0, !. 
abs2(X,Y) :- Y is -X. 
니콜라스의 의견도 방법을 제안

에 "arithmetize"절대 값 (로직 정의를 사용하기보다는) 및 피 : 내가 쓴 것입니다 그래서

는 컷의 사용을 허용, 이것이다 "그런 식으로"자른다.

+1

"숨겨진 컷"이란 이름은 컷처럼 동작하지 않습니다 :!/0은 대체 절이 시도되는 것을 방지하지만 로컬 if-then-else는 커밋하지 않습니다. 그러므로 나는이 가난한 용어를 발견한다. – mat

+2

@mat : 더 나은 용어를 배우게되어 기쁩니다. 필자는 내 솔루션이 컷의 (명백한) 사용을 피하면서 제공하는 일종의 공개로서 "숨겨진 컷"을 작성하여 독자가 내 솔루션이 유효한지 또는 "속임수"인지를 판단 할 수 있습니다. "if-then-else"에서 지역화 된 커밋/커밋에 대한 설명은 SWI-Prolog 문서에서 제어 조건 (2.4.7 절)을 비교하십시오. http://www.swi-prolog.org/pldoc/doc_for?object=section%282,%274.7%27,swi%28%27/doc/Manual/control.html%27%29%29 – hardmath

5

내 프롤로그는 약간 녹슬었지만 왜자를 필요가 있습니까?

abs2(X,Y) :- X < 0 -> Y is -X ; Y = X. 

:

abs(X, Y) :- number(X) , X < 0 , Y is -X . 
abs(X, X) :- number(X) , X >= 0 . 
+4

코드는 여전히 선택 점을 떠난다. 이 선택은 실패로 이어진다. 그러나 그럼에도 불구하고 고려된다. 상처는 그것을 피할 것입니다. – Kaarel

+3

정수 값을 처리하고 있다는 것을 알고 있다면, 비트를 트위 들링하여 선택 점을 사용하여 ABS를 계산할 수 있습니다. http://www-graphics.stanford.edu/~seander/bithacks.html#IntegerAbs –

+6

또 다른 옵션은 다음과 같습니다. :'abs (X, Y) : - Y는 sign (X) * X입니다 .' (프롤로그 구현이 내장 된 sign/1 술어를 지원한다고 가정). –

3

을 사용할 필요가 없습니다!

은 간단하게 쓰기 :

abs2(X,Y) :- Y is abs(X).