산술
산술
산술 표현식의 평가와 산술 비교 술어들을 설명해요.
본문
산술 표현식의 평가
산술 표현식은 숫자, 변수, 그리고 산술 함수를 나타내는 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 → ?- 이항 함수, 각 피연산자는 정수 또는 부동소수점 수이고 결과는 선택된 피연산자와 같은 타입.min과max에 사용됨. 정수와 부동소수점 수 사이의 동등의 경우 결과는 정수라는 점을 주의하세요.
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 Expression은 Result가 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 술어.