문제

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) 등을 사용하는 것이 권장합니다. 대신에 보다 낮은 수준의 산술 곤경을 사용하는 것.

또한 참조하십시오 , 그리고 자세한 내용은.

우연히도 운영자 =:= 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가 동일하면 성공합니다.

첫 번째 연산자 = : = 점검이 같습니까? 예를 들어여기에 이미지 설명을 입력하십시오

그것은 "반환 진실입니다. 그러나 이것은 거짓을 반환합니다.여기에 이미지 설명을 입력하십시오

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top