산술 제약

산술 제약

FD 산술 제약을 설명해요.

출처: GNU Prolog Manual - Arithmetic constraints

본문

FD 산술 표현식

FD 산술 표현식은 정수, 변수(Prolog 또는 FD 변수), 산술 함수를 나타내는 functor(또는 연산자)로 만들어진 Prolog 항이에요. 다음 표는 FD 산술 표현식의 구성 요소를 자세히 설명해요:

FD 표현식 결과
Prolog 변수 도메인 0..fd_max_integer
FD 변수 X X의 도메인
정수 N 도메인 N..N
+ E E와 같음
- E E의 반대
E1 + E2 E1과 E2의 합
E1 - E2 E1에서 E2를 뺀 것
E1 * E2 E1에 E2를 곱한 것
E1 / E2 E1을 E2로 나눈 정수 나눗셈(나머지가 0일 때만 성공)
E1 ** E2 E1의 E2 거듭제곱(E1 또는 E2는 정수여야 함)
min(E1,E2) E1과 E2의 최소
max(E1,E2) E1과 E2의 최대
dist(E1,E2) 거리, 즉 |E1 - E2|
E1 // E2 E1을 E2로 나눈 정수 나눗셈의 몫
E1 rem E2 E1을 E2로 나눈 정수 나눗셈의 나머지
quot_rem(E1,E2,R) E1을 E2로 나눈 정수 나눗셈의 몫(R은 E1을 E2로 나눈 나머지)

FD 표현식은 선형으로 제한되지 않아요. 그러나 비선형 제약은 보통 선형 제약보다 제약 전파를 덜 일으켜요. +, -, *, /, //, rem, **는 미리 정의된 중위 연산자예요. +-는 미리 정의된 접두 연산자예요(8.14.10절).

Errors

  • 하위 표현식이 _ ** E 형태이고 E가 변수 — instantiation_error
  • 하위 표현식 E가 변수도 정수도 FD 산술 functor도 아님 — type_error(fd_evaluable, E)
  • 표현식이 너무 복잡 — resource_error(too_big_fd_constraint)

부분 AC: (#=)/2 - 제약 같음, (#=)/2 - 제약 같지 않음, (#<)/2 - 제약 작음, (#=<)/2 - 제약 작거나 같음, (#>)/2 - 제약 큼, (#>=)/2 - 제약 크거나 같음

Templates

#=(?fd_evaluable, ?fd_evaluable)
#\=(?fd_evaluable, ?fd_evaluable)
#<(?fd_evaluable, ?fd_evaluable)
#=<(?fd_evaluable, ?fd_evaluable)
#>(?fd_evaluable, ?fd_evaluable)
#>=(?fd_evaluable, ?fd_evaluable)

Description

  • FdExpr1 #= FdExpr2 — FdExpr1을 FdExpr2와 같도록 제약.
  • FdExpr1 #\= FdExpr2 — FdExpr1을 FdExpr2와 다르도록 제약.
  • FdExpr1 #< FdExpr2 — FdExpr1을 FdExpr2보다 작도록 제약.
  • FdExpr1 #=< FdExpr2 — FdExpr1을 FdExpr2보다 작거나 같도록 제약.
  • FdExpr1 #> FdExpr2 — FdExpr1을 FdExpr2보다 크도록 제약.
  • FdExpr1 #>= FdExpr2 — FdExpr1을 FdExpr2보다 크거나 같도록 제약.

FdExpr1과 FdExpr2는 산술 FD 표현식이에요(9.6.1절). #=, #\=, #<, #=<, #>, #>=는 미리 정의된 중위 연산자예요(8.14.10절).

이 술어들은 관련 변수의 도메인을 줄이기 위해 부분 호 일관성 알고리즘을 사용해 솔버가 관리하는 산술 제약을 게시해요. 이 기법에서는 변수 도메인의 경계만 갱신돼요. 이는 전체 호 일관성 기법(9.6.3절)보다 전파가 적지만 산술에는 일반적으로 더 효율적이에요. 이 산술 제약들은 반영될 수 있어요(9.7절).

Errors: 산술 FD 표현식의 구문에 대한 가능한 오류를 참조해요(9.6.1절).

Portability: GNU Prolog 술어.

전체 AC: (#=#)/2 - 제약 같음, (#=#)/2 - 제약 같지 않음, (#<#)/2 - 제약 작음, (#=<#)/2 - 제약 작거나 같음, (#>#)/2 - 제약 큼, (#>=#)/2 - 제약 크거나 같음

Templates

#=#(?fd_evaluable, ?fd_evaluable)
#\=#(?fd_evaluable, ?fd_evaluable)
#<#(?fd_evaluable, ?fd_evaluable)
#=<#(?fd_evaluable, ?fd_evaluable)
#>#(?fd_evaluable, ?fd_evaluable)
#>=#(?fd_evaluable, ?fd_evaluable)

Description

  • FdExpr1 #=# FdExpr2 — FdExpr1을 FdExpr2와 같도록 제약.
  • FdExpr1 #\=# FdExpr2 — FdExpr1을 FdExpr2와 다르도록 제약.
  • FdExpr1 #<# FdExpr2 — FdExpr1을 FdExpr2보다 작도록 제약.
  • FdExpr1 #=<# FdExpr2 — FdExpr1을 FdExpr2보다 작거나 같도록 제약.
  • FdExpr1 #># FdExpr2 — FdExpr1을 FdExpr2보다 크도록 제약.
  • FdExpr1 #>=# FdExpr2 — FdExpr1을 FdExpr2보다 크거나 같도록 제약.

FdExpr1과 FdExpr2는 산술 FD 표현식이에요(9.6.1절). #=#, #\=#, #<#, #=<#, #>#, #>=#는 미리 정의된 중위 연산자예요(8.14.10절).

이 술어들은 관련 변수의 도메인을 줄이기 위해 전체 호 일관성 알고리즘을 사용해 솔버가 관리하는 산술 제약을 게시해요. 이 기법에서는 변수의 전체 도메인이 갱신돼요. 이는 부분 호 일관성 기법(9.6.1절)보다 더 많은 전파를 일으키지만 산술에는 일반적으로 덜 효율적이에요. 이 산술 제약들은 반영될 수 있어요(9.7.1절).

Errors: 산술 FD 표현식의 구문에 대한 가능한 오류를 참조해요(9.6.1절).

Portability: GNU Prolog 술어.

fd_prime/1, fd_not_prime/1

Templates

fd_prime(?fd_variable)
fd_not_prime(?fd_variable)

Description

  • fd_prime(X) — X를 0..vector_max 사이의 소수로 제약. 이 제약은 X의 도메인에 희소 표현을 강제해요(9.1절).
  • fd_not_prime(X) — X를 0..vector_max 사이의 비소수로 제약. 이 제약은 X의 도메인에 희소 표현을 강제해요(9.1절).

Errors

  • X가 FD 변수도 정수도 아님 — type_error(fd_variable, X)

Portability: GNU Prolog 술어.

더 알아보기