에서 컷의 사용 방지 : 컷 ("!")를 사용하지 않고나는 다음과 같은 코드로 프롤로그에 다음과 같은 기능을 구현 한 프롤로그 절대 값 술어
abs2(X, Y) :- X < 0, Y is -X.
abs2(X, X) :- X >= 0, !.
가 어떻게이 기능을 구현할 수 있습니까?
에서 컷의 사용 방지 : 컷 ("!")를 사용하지 않고나는 다음과 같은 코드로 프롤로그에 다음과 같은 기능을 구현 한 프롤로그 절대 값 술어
abs2(X, Y) :- X < 0, Y is -X.
abs2(X, X) :- X >= 0, !.
가 어떻게이 기능을 구현할 수 있습니까?
이 프롤로그의 경우 - 당시 다른 구조의 "숨겨진"커트있다 : 당신이 제대로 술어를 작성하는 경우 절단이 필요하므로, 되돌아은 성공할 수 없다 그것은 기발한 것이지만, 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"절대 값 (로직 정의를 사용하기보다는) 및 피 : 내가 쓴 것입니다 그래서
는 컷의 사용을 허용, 이것이다 "그런 식으로"자른다.
내 프롤로그는 약간 녹슬었지만 왜자를 필요가 있습니까?
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 .
코드는 여전히 선택 점을 떠난다. 이 선택은 실패로 이어진다. 그러나 그럼에도 불구하고 고려된다. 상처는 그것을 피할 것입니다. – Kaarel
정수 값을 처리하고 있다는 것을 알고 있다면, 비트를 트위 들링하여 선택 점을 사용하여 ABS를 계산할 수 있습니다. http://www-graphics.stanford.edu/~seander/bithacks.html#IntegerAbs –
또 다른 옵션은 다음과 같습니다. :'abs (X, Y) : - Y는 sign (X) * X입니다 .' (프롤로그 구현이 내장 된 sign/1 술어를 지원한다고 가정). –
"숨겨진 컷"이란 이름은 컷처럼 동작하지 않습니다 :!/0은 대체 절이 시도되는 것을 방지하지만 로컬 if-then-else는 커밋하지 않습니다. 그러므로 나는이 가난한 용어를 발견한다. – mat
@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