문제
Prolog에는 일부 특수 사업자가 있습니다. 그중 하나는 "IS"입니다. 그러나 최근에는 = : = 연산자를 만났으며 어떻게 작동하는지 전혀 모릅니다.
누군가가 운영자가하는 일을 설명 할 수 있으며, 그러한 특수 운영자의 사전 정의 된 목록을 어디에서 찾을 수 있습니까?
감사.
해결책
?- 2+3 =:= 6-1.
true.
?- 2+3 is 6-1.
false.
또한 문서를 참조하십시오 http://www.swi-prolog.org/pldoc/man?predicate=is/2
다른 팁
그럼에도 불구하고 위의 대답은 여기서 몇 마디의 설명이 필요하다고 생각합니다.
사전에 짧은 메모 : Prolog의 산술 표현은 단지 용어 ( "모든 것이 Prolog의 용어")이며 평가되지 않습니다. 자동으로. (LISP 배경이있는 경우 인용 된 목록을 생각해보십시오). 그래서 3 + 4
동일합니다 +(3,4)
, 그 자체로는 아무것도하지 않습니다. 그것은 개별 사전의 책임입니다 평가하다 그 용어.
몇몇 내장 곤경은 암시 적 평가를 수행하며, 그 중에서도 산술적 호출 연산자가 좋아합니다. =:=
그리고 is
. 하는 동안 =:=
인수를 모두 평가하고 결과를 비교합니다. is
그것들 만 받아들이고 평가합니다 오른쪽 산술 표현으로서의 인수.
그만큼 왼쪽 인수는 원자, 숫자 상수 (오른쪽 피연산자 평가 결과와 비교) 또는 변수 여야합니다. 그것이 있다면 경계 변수, 그 값은 숫자 여야하며 이전의 경우와 같이 오른쪽 피연산자와 비교됩니다. 그것이 있다면 매여 있지 않은 변수, 오른쪽 피연산자 평가 결과는 해당 변수에 바인딩됩니다. is
이 후자의 경우에 종종 변수를 바인딩하기 위해 사용됩니다.
위의 링크 된 Prolog 사전에서 예제를 선택하려면 : 숫자 N이 짝수지 테스트하려면 두 연산자를 모두 사용할 수 있습니다.
0 is N mod 2 % true if N is even
0 =:= N mod 2 % dito
그러나 작업 결과를 캡처하려면 첫 번째 변형 만 사용할 수 있습니다. X가 바운드되지 않은 경우 :
X is N mod 2 % X will be 0 if N is even
X =:= N mod 2 % !will bomb with argument/instantiation error!
경험 규칙 : 산술 비교 만 필요하면 사용하십시오. =:=
. 평가 결과를 캡처하려면 사용하십시오. is
.
기존 답변을 보완하면 몇 가지 추가 요점을 언급하고 싶습니다.
연산자는 연산자입니다
우선, 운영자 =:=
이름에서 알 수 있듯이 an 운영자. Prolog에서는 술어를 사용할 수 있습니다 current_op/3
운영자에 대해 자세히 알아 보려면 예를 들어:
?- current_op (prec, type, = : =). Prec = 700, Type = xfx.
이것은 운영자를 의미합니다 =:=
가지다 상위 700입니다 유형 xfx
. 이것은 그것이 바이너리임을 의미합니다 디픽스 운영자.
이것은 당신을 의미합니다 ~할 수 있다, 만약 너라면 원하다, 같은 용어를 작성하십시오=:=(X, Y)
동등하게 ~처럼 X =:= Y
. ~ 안에 두 경우 모두,, untctor 용어는입니다 =:=
, 그리고 arity 용어는 2입니다. 사용할 수 있습니다 write_canonical/1
이것을 확인하려면 :
?- write_canonical(a =:= b). = : = = (a, b)
술어는 연산자가 아닙니다
여태까지는 그런대로 잘됐다! 이것은 모두 순전히였습니다 구문 특징. 그러나 당신이 무엇인지 실제로 묻는 것은 술부 (=:=)/2
, 그 이름은 누구의 이름입니다 =:=
그리고 2가 필요합니다논쟁.
다른 사람들이 이미 설명했듯이, 술어(=:=)/2
denotes 산술 평등 두 개의 산술 표현. 그것은이다 진실 IFF 그것의 주장 평가하다 같은 숫자로.
예를 들어, 가장 일반적인 쿼리를 시도해 보겠습니다. 변수 논쟁으로 :
?- X =:= Y. 오류 : 인수는 충분히 인스턴스화되지 않습니다
따라서이 술어는입니다 ~ 아니다 우리는 그것을 사용할 수 없기 때문에 진정한 관계 생성 결과! 이것은 당신이 일반적으로 "선언적인 프로그래밍"이라고 부르는 것과 충돌하는이 술어의 심각한 단점입니다.
술어는 바로에서만 작동합니다 특정한 두 주장이 완전히 인스턴스화되는 상황. 예를 들어:
?- 1 + 2 =:= 3. 진실.
우리는 그러한 곤경을 부릅니다 모드 특히 만 사용할 수 있기 때문입니다 모드 사용법. 대부분의 초보자에게는 Moded Predicates가 악몽 사용하려면 프로그램에 대해 생각해야하기 때문입니다. 절차 적으로, 그것은 처음에는 꽤 힘들고 나중에도 여전히 힘들다. 또한 모드는 심각하게 곤경에 처해 있습니다 일반성을 제한하십시오 프로그램의 모든 방향으로 사용할 수 없기 때문에 ~할 수 있었다 순수한 곤경을 사용하십시오.
제약은보다 일반적인 대안입니다
Prolog도 많은 것을 제공합니다 더 일반 산술은 산술 형태로 예정됩니다 제약.
예를 들어, 경우 정수, 프롤로그 시스템을 사용해보십시오 CLP (FD) 제약 조건. 가장 중요한 CLP (FD) 제약 조건 중 하나는 산술을 나타냅니다. 평등 그리고 호출됩니다(#=)/2
. 완전한 비유로 (=:=)/2
,, 운영자 (#=)/2
또한 디픽스 연산자이므로 예를 들어 다음과 같이 쓸 수 있습니다.
| ?- 1 + 2 #= 3. yes
GNU Prolog를 하나의 특정 예로 사용하고 있으며 다른 많은 Prolog 시스템도 CLP (FD) 구현을 제공합니다.
제약 조건의 주요 매력은 그것들에서 발견됩니다 대부분. 예를 들어,와 달리 (=:=)/2
, 우리는 술부 (#=)/2
:
| ? -x + 2 #= 3. X = 1 | ? -1 + y #= 3. Y = 2
그리고 우리는 심지어 물어볼 수도 있습니다 가장 일반 질문:
| ?- x #= y. X = _#0(0..268435455) Y = _#0(0..268435455)
자연스럽게이 사전이 프롤로그에 어떻게 조화를 이루고 처지 쿼리 할 수있는 정수 표현 사이 모든 방향.
관심 영역에 따라 CLP (FD), CLP (Q), CLP (B) 등을 사용하는 것이 권장합니다. 대신에 보다 낮은 수준의 산술 곤경을 사용하는 것.
또한 참조하십시오 CLPFD, CLPQ 그리고 CLPB 자세한 내용은.
우연히도 운영자 =:=
CLP (b)에서 a 완전히 이의:
?- sat(A =:= B+1). a = 1, sat (b = : = b).
이것은 당신이 그것을 구별해야한다는 것을 보여줍니다 운영자 그리고 일치합니다. 위의 경우 술부 sat/1
주어진 표현을 제안 공식으로 해석했으며,이 맥락에서 =:=
부울 표현의 평등을 나타냅니다.
나는 내 자신의 대답을 찾았다. http://www.cse.unsw.edu.au/~billw/prologdict.html
통일 (=)/2 또는 구문 평등 (==)/2에서 부트 스트랩 될 수없는 ISO 핵심 표준 술어 연산자입니다. 섹션 8.7 산술 비교에 정의됩니다. 그리고 기본적으로 다음과 같이 작동합니다.
E =:= F :-
X is E,
Y is F,
arithmetic_compare(=, X, Y).
따라서 왼쪽 (LHS)과 오른쪽 (RHS)은 비교하기 전에 평가되는 산술 표현이어야합니다. 산술 비교는 숫자 유형에서 비교할 수 있습니다. 그래서 우리는 다음과 같습니다.
GNU Prolog 1.4.5 (64 bits)
?- 0 = 0.0.
no
?- 0 == 0.0
no
?- 0 =:= 0.0.
yes
= : =는 비교 연산자입니다 .a1 = : = a2 표현식 값 A1과 A2가 동일하면 성공합니다. A1 == A2 용어 A1과 A2가 동일하면 성공합니다.
첫 번째 연산자 = : = 점검이 같습니까? 예를 들어여기에 이미지 설명을 입력하십시오
그것은 "반환 진실입니다. 그러나 이것은 거짓을 반환합니다.여기에 이미지 설명을 입력하십시오