산술

산술

산술 표현식의 평가와 산술 비교 술어들을 설명해요.

출처: GNU Prolog Manual - Arithmetic

본문

산술 표현식의 평가

산술 표현식은 숫자, 변수, 그리고 산술 함수를 나타내는 functor(또는 연산자)로 만들어진 Prolog 항이에요. 표현식이 평가될 때 각 변수는 비변수 표현식에 바인딩되어야 해요. 표현식은 숫자(정수 또는 부동소수점 수)로 평가돼요.

다음 표는 산술 표현식의 구성 요소, 평가 방법, 기대/반환 타입, ISO인지 확장인지를 상세히 보여줘요:

표현식 결과 = eval(Expression) 시그니처 ISO
변수가 표현식 E에 바인딩됨 결과는 eval(E) IF → IF Y
정수 그 숫자 I Y
부동소수점 수 그 숫자 F Y
pi π = 3.141592... 의 값 F Y
e e = 2.718281... 의 값 F N
epsilon 1.0과 최소 부동소수점 > 1.0 사이의 차이 F N
+ E eval(E) IF → IF Y
- E -eval(E) IF → IF Y
inc(E) eval(E) + 1 IF → IF N
dec(E) eval(E) - 1 IF → IF N
E1 + E2 eval(E1) + eval(E2) IF, IF → IF Y
E1 - E2 eval(E1) - eval(E2) IF, IF → IF Y
E1 * E2 eval(E1) * eval(E2) IF, IF → IF Y
E1 / E2 eval(E1) / eval(E2) IF, IF → F Y
E1 // E2 rnd(eval(E1) / eval(E2)) I, I → I Y
E1 rem E2 eval(E1) - (rnd(eval(E1) / eval(E2)) * eval(E2)) I, I → I Y
E1 div E2 ⌊(eval(E1) - eval(E1) mod eval(E2)) / eval(E2)⌋ I, I → I Y
E1 mod E2 eval(E1) - (⌊eval(E1) / eval(E2)⌋ * eval(E2)) I, I → I Y
E1 /\ E2 eval(E1) 비트단위 AND eval(E2) I, I → I Y
E1 / E2 eval(E1) 비트단위 OR eval(E2) I, I → I Y
xor(E1,E2) eval(E1) 비트단위 XOR eval(E2) I, I → I Y
\ E 비트단위 NOT eval(E) I → I Y
E1 << E2 eval(E1) 정수 왼쪽 시프트 eval(E2) I, I → I Y
E1 >> E2 eval(E1) 정수 오른쪽 시프트 eval(E2) I, I → I Y
lsb(E) eval(E)의 최하위 비트(0부터) 또는 -1 I → I N
msb(E) eval(E)의 최상위 비트(0부터) 또는 -1 I → I N
popcount(E) eval(E)에서 1-비트의 개수 I → I N
abs(E) eval(E)의 절댓값 IF → IF Y
sign(E) eval(E)의 부호(-1 if < 0, 0 if = 0, +1 if > 0) IF → IF Y
min(E1,E2) eval(E1)과 eval(E2) 사이의 최솟값 IF, IF → ? Y
max(E1,E2) eval(E1)과 eval(E2) 사이의 최댓값 IF, IF → ? Y
gcd(E1,E2) eval(E1)과 eval(E2)의 최대공약수 I, I → I N
E1 ^ E2 eval(E1)의 eval(E2) 제곱 IF, IF → IF Y
E1 ** E2 eval(E1)의 eval(E2) 제곱 IF, IF → F Y
sqrt(E) eval(E)의 제곱근 IF → F Y
tan(E) eval(E)의 탄젠트 IF → F Y
atan(E) eval(E)의 아크탄젠트 IF → F Y
atan2(Y,X) 사분면에 두 부호를 모두 사용한 eval(Y)/eval(X)의 아크탄젠트 주값 IF → F Y
cos(E) eval(E)의 코사인 IF → F Y
acos(E) eval(E)의 아크코사인 IF, IF → F Y
sin(E) eval(E)의 사인 IF → F Y
asin(E) eval(E)의 아크사인 IF → F Y
tanh(E) eval(E)의 쌍곡 탄젠트 IF → F N
atanh(E) eval(E)의 쌍곡 아크탄젠트 IF → F N
cosh(E) eval(E)의 쌍곡 코사인 IF → F N
acosh(E) eval(E)의 쌍곡 아크코사인 IF, IF → F N
sinh(E) eval(E)의 쌍곡 사인 IF → F N
asinh(E) eval(E)의 쌍곡 아크사인 IF → F N
exp(E) e의 eval(E) 제곱 IF → F Y
log(E) eval(E)의 자연로그 IF → F Y
log10(E) eval(E)의 밑 10 로그 IF → F N
log(R, E) eval(E)의 밑 eval(R) 로그 F, IF → F N
float(E) eval(E)와 같은 부동소수점 수 IF → F Y
ceiling(E) eval(E)를 가장 가까운 정수로 올림 F → I Y
floor(E) eval(E)를 가장 가까운 정수로 내림 F → I Y
round(E) eval(E)를 가장 가까운 정수로 반올림 F → I Y
truncate(E) eval(E)의 정수 값 F → I Y
float_fractional_part(E) eval(E)의 소수 부분과 같은 부동소수점 F → F Y
float_integer_part(E) eval(E)의 정수 부분과 같은 부동소수점 F → F Y

시그니처 필드의 의미는 다음과 같아요:

  • I → I - 단항 함수, 피연산자는 정수여야 하고 결과는 정수.
  • F → F - 단항 함수, 피연산자는 부동소수점 수여야 하고 결과는 부동소수점 수.
  • F → I - 단항 함수, 피연산자는 부동소수점 수여야 하고 결과는 정수.
  • IF → F - 단항 함수, 피연산자는 정수 또는 부동소수점 수이고 결과는 부동소수점 수.
  • IF → IF - 단항 함수, 피연산자는 정수 또는 부동소수점 수이고 결과는 피연산자와 같은 타입.
  • I, I → I - 이항 함수, 각 피연산자는 정수여야 하고 결과는 정수.
  • IF, IF → IF - 이항 함수, 각 피연산자는 정수 또는 부동소수점 수이고, 최소 하나가 부동소수점 수이면 결과는 부동소수점 수, 그렇지 않으면 정수.
  • IF, IF → ? - 이항 함수, 각 피연산자는 정수 또는 부동소수점 수이고 결과는 선택된 피연산자와 같은 타입. minmax에 사용됨. 정수와 부동소수점 수 사이의 동등의 경우 결과는 정수라는 점을 주의하세요.

is, +, -, *, /, //, div, rem, mod, /\, \/, <<, >>, **, ^는 미리 정의된 중위 연산자예요. +, -, \는 미리 정의된 접두 연산자예요(8.14.10절).

정수 나눗셈 반올림 함수: 정수 나눗셈 반올림 함수 rnd(X)는 부동소수점 수 X를 정수로 반올림해요. 이 함수에는 (대상 머신에 따라) 두 가지 가능한 정의가 있으며, 둘은 음수에서 다르게 동작해요:

  • rnd(X) = X의 정수 부분, 예: rnd(-1.5) = -1 (0을 향해 반올림)
  • rnd(X) = ⌊X⌋, 예: rnd(-1.5) = -2 (−∞를 향해 반올림)

이 함수의 정의는 정수 나눗셈과 나머지((//)/2 및 (rem)/2)의 정의를 결정해요. integer_rounding_function Prolog 플래그의 값(toward_zero 또는 down)을 테스트해 어떤 함수가 사용되는지 알 수 있어요(8.22.1절). 0을 향한 반올림이 가장 흔한 경우이므로, −∞를 향한 반올림을 고려하는 두 개의 추가 평가 가능 functor((div)/2 및 (mod)/2)가 제공돼요.

빠른 수학 모드: 정수 계산을 빠르게 하기 위해 GNU Prolog 컴파일러는 --fast-math 옵션(4.4.3절)으로 호출하면 더 빠른 코드를 생성할 수 있어요. 이 모드에서는 정수 연산만 허용되고 표현식의 변수는 평가 시점에 정수에 바인딩되어야 해요. 타입 검사는 수행되지 않아요.

Errors

  • 하위 표현식 E가 변수 - instantiation_error
  • 하위 표현식 E가 숫자도 평가 가능 functor도 아님 - type_error(evaluable, E)
  • 하위 표현식 E가 정수가 기대되는데 부동소수점 수 - type_error(integer, E)
  • 하위 표현식 E가 부동소수점 수가 기대되는데 정수 - type_error(float, E)
  • 0으로 나눗셈 발생 - evaluation_error(zero_divisor)

Portability: 어떤 평가 가능 functor가 ISO이고 어떤 것이 GNU Prolog 확장인지 확인하려면 위 표를 참고하세요. 효율성상 GNU Prolog는 다음 ISO 산술 오류를 감지하지 않아요: float_overflow, int_overflow, int_underflow, undefined.

(is)/2 - 표현식 평가

Templates

is(?term, +evaluable)

Description Result is ExpressionResult가 eval(Expression)과 통일될 수 있으면 성공해요. eval 함수의 정의는 산술 표현식의 평가(8.6.1절)를 참고해요.

is는 미리 정의된 중위 연산자예요(8.14.10절).

Errors: 가능한 오류는 산술 표현식의 평가(8.6.1절)를 참고.

Portability: ISO 술어.

(=:=)/2 - 산술 같음, (==)/2 - 산술 같지 않음, (<)/2 - 산술 미만, (=<)/2 - 산술 이하, (>)/2 - 산술 초과, (>=)/2 - 산술 이상

Templates

=:=(+evaluable, +evaluable)
=\=(+evaluable, +evaluable)
<(+evaluable, +evaluable)
=<(+evaluable, +evaluable)
>(+evaluable, +evaluable)
>=(+evaluable, +evaluable)

Description

  • Expr1 =:= Expr2 - eval(Expr1) = eval(Expr2)이면 성공.
  • Expr1 =\= Expr2 - eval(Expr1) ≠ eval(Expr2)이면 성공.
  • Expr1 < Expr2 - eval(Expr1) < eval(Expr2)이면 성공.
  • Expr1 =< Expr2 - eval(Expr1) ≤ eval(Expr2)이면 성공.
  • Expr1 > Expr2 - eval(Expr1) > eval(Expr2)이면 성공.
  • Expr1 >= Expr2 - eval(Expr1) ≥ eval(Expr2)이면 성공.

eval 함수의 정의는 산술 표현식의 평가(8.6.1절)를 참고해요. =:=, =\=, <, =<, >, >=는 미리 정의된 중위 연산자예요(8.14.10절).

Errors: 가능한 오류는 산술 표현식의 평가(8.6.1절)를 참고.

Portability: ISO 술어.

succ/2

Templates

succ(+integer, ?integer)
succ(-integer, +integer)

Description succ(X, Y)는 Y가 비음 정수 X의 후속자(successor)일 때 참이에요.

Errors

  • X와 Y가 모두 변수 - instantiation_error
  • X가 변수도 정수도 아님 - type_error(integer, X)
  • Y가 변수도 정수도 아님 - type_error(integer, Y)
  • X가 정수 < 0 - domain_error(not_less_than_zero, X)
  • Y가 정수 < 0 - domain_error(not_less_than_zero, Y)

Portability: GNU Prolog 술어.

더 알아보기