기호 제약

기호 제약

FD 기호 제약을 설명해요.

출처: GNU Prolog Manual - Symbolic constraints

본문

fd_all_different/1

Templates

fd_all_different(+fd_variable_list)

Description fd_all_different(List)은 List의 모든 변수가 서로 다른 값을 취하도록 제약해요. 이는 각 변수 쌍에 부등식 제약을 게시하는 것과 동일해요. 이 제약은 변수가 ground가 될 때 촉발되어, 그 값을 다른 변수들의 도메인에서 제거해요.

Errors

  • List가 부분 리스트 — instantiation_error
  • List가 부분 리스트도 리스트도 아님 — type_error(list, List)
  • List 리스트의 어떤 요소 E가 변수도 정수도 FD 변수도 아님 — type_error(fd_variable, E)

Portability: GNU Prolog 술어.

fd_element/3

Templates

fd_element(?fd_variable, +integer_list, ?fd_variable)

Description fd_element(I, List, X)는 X를 List의 I번째(1부터) 정수와 같도록 제약해요.

Errors

  • I가 변수도 FD 변수도 정수도 아님 — type_error(fd_variable, I)
  • X가 변수도 FD 변수도 정수도 아님 — type_error(fd_variable, X)
  • List가 부분 리스트이거나 변수인 요소 E를 가진 리스트 — instantiation_error
  • List가 부분 리스트도 리스트도 아님 — type_error(list, List)
  • List 리스트의 어떤 요소 E가 변수도 정수도 아님 — type_error(integer, E)

Portability: GNU Prolog 술어.

fd_element_var/3

Templates

fd_element_var(?fd_variable, +fd_variable_list, ?fd_variable)

Description fd_element_var(I, List, X)는 X를 List의 I번째(1부터) 변수와 같도록 제약해요. 이 제약은 fd_element/3(9.8.2절)과 비슷하지만 List는 FD 변수도 포함할 수 있어요(정수만이 아니라).

Errors

  • I가 변수도 FD 변수도 정수도 아님 — type_error(fd_variable, I)
  • X가 변수도 FD 변수도 정수도 아님 — type_error(fd_variable, X)
  • List가 부분 리스트 — instantiation_error
  • List가 부분 리스트도 리스트도 아님 — type_error(list, List)
  • List 리스트의 어떤 요소 E가 변수도 정수도 FD 변수도 아님 — type_error(fd_variable, E)

Portability: GNU Prolog 술어.

fd_atmost/3, fd_atleast/3, fd_exactly/3

Templates

fd_atmost(+integer, +fd_variable_list, +integer)
fd_atleast(+integer, +fd_variable_list, +integer)
fd_exactly(+integer, +fd_variable_list, +integer)

Description

  • fd_atmost(N, List, V) — List의 변수 중 V와 같은 것이 기껏해야 N개라는 제약을 게시.
  • fd_atleast(N, List, V) — List의 변수 중 V와 같은 것이 적어도 N개라는 제약을 게시.
  • fd_exactly(N, List, V) — List의 변수 중 V와 같은 것이 정확히 N개라는 제약을 게시.

이 제약들은 fd_cardinality/2(9.7.4절)의 특수 경우지만 구현이 더 효율적이에요.

Errors

  • N이 변수 — instantiation_error
  • N이 변수도 정수도 아님 — type_error(integer, N)
  • V가 변수 — instantiation_error
  • V가 변수도 정수도 아님 — type_error(integer, V)
  • List가 부분 리스트 — instantiation_error
  • List가 부분 리스트도 리스트도 아님 — type_error(list, List)
  • List 리스트의 어떤 요소 E가 변수도 FD 변수도 정수도 아님 — type_error(fd_variable, E)

Portability: GNU Prolog 술어.

fd_relation/2, fd_relationc/2

Templates

fd_relation(+integer_list_list, ?fd_variable_list)
fd_relationc(+integer_list_list, ?fd_variable_list)

Description fd_relation(Relation, Vars)는 변수들의 튜플 Vars를 리스트 Relation의 한 튜플과 같도록 제약해요. 튜플은 리스트로 표현돼요.

예: X AND Y ⇔ Z가 되도록 불리언 AND 관계를 정의:

and(X,Y,Z) :-
    fd_relation([[0,0,0],[0,1,0],[1,0,0],[1,1,1]], [X,Y,Z]).

fd_relationc(Columns, Vars)fd_relation/2와 비슷하지만 관계가 튜플 리스트가 아니라 관계의 열(column) 리스트로 주어져요. 열은 리스트로 표현돼요.

예:

and(X,Y,Z) :-
    fd_relationc([[0,0,1,1],[0,1,0,1],[0,0,0,1]], [X,Y,Z]).

Errors

  • Relation이 부분 리스트이거나 변수인 하위 항 E를 가진 리스트 — instantiation_error
  • Relation이 부분 리스트도 리스트도 아님 — type_error(list, Relation)
  • Relation 리스트의 어떤 요소 E가 변수도 정수도 아님 — type_error(integer, E)
  • Vars가 부분 리스트 — instantiation_error
  • Vars가 부분 리스트도 리스트도 아님 — type_error(list, Vars)
  • Vars 리스트의 어떤 요소 E가 변수도 정수도 FD 변수도 아님 — type_error(fd_variable, E)

Portability: GNU Prolog 술어.

더 알아보기