Prolog Language
데이터 구조
수색…
기울기
리스트 는 특별한 종류의 복합 용어 입니다. 목록은 유도 적으로 정의됩니다.
- atom
[]
은 빈리스트 를 나타내는 리스트 이다. - 경우
Ls
목록 다음 용어'.'(L, Ls)
또한리스트이다.
Prolog에는 편리하게 목록을 표시하는 특수 구문이 있습니다.
- 목록
'.'(a, '.'(b, '.'(c, [])))
는[a,b,c]
와 같이 쓸 수도 있습니다. -
'.'(L, Ls)
라는 용어는[L|Ls]
로도 쓰일 수 있습니다.
이 표기법은 어떤 식 으로든 결합 될 수 있습니다. 예를 들어, [a,b|Ls]
라는 용어는 Ls
가 목록 인 경우 목록입니다.
목록 만들기
변수 List로 통합 된 리터럴로 구성된 목록입니다.
?- List = [1,2,3,4].
List = [1, 2, 3, 4].
consing으로 목록 작성 :
?- Tail = [2, 3, 4], List = [1|Tail].
Tail = [2, 3, 4],
List = [1, 2, 3, 4].
내장 length/2
사용하여 알 수없는 값 목록 작성 :
?- length(List,5).
List = [_G496, _G499, _G502, _G505, _G508].
프롤로그에서는 모든 것이 본질적으로 용어이므로 목록은 이기종으로 작동합니다.
?- List = [1, 2>1, this, term(X), 7.3, a-A].
List = [1, 2>1, this, term(X), 7.3, a-A].
즉, 목록에는 내부 목록이라고도하는 다른 목록도 포함될 수 있습니다.
List = [[1,2],[3,[4]]].
한 쌍
규칙에 따라, 펑터 (-)/2
는 종종 Prolog에서 요소 쌍 을 나타 내기 위해 사용됩니다. 예를 들어, -(A, B)
라는 용어는 A
와 B
의 쌍을 나타냅니다. Prolog에서 (-)/2
는 삽입 연산자 로 정의됩니다. 따라서이 용어는 AB
와 동등하게 쓰여질 수 있습니다.
일반적으로 사용 가능한 많은 술어도이 구문을 사용하여 쌍을 나타냅니다. 이것의 예는 keysort/2
와 pairs_keys_values/3
입니다.
연관 목록
모든 심각한 Prolog 시스템에서 연관 목록 을 사용하면 요소 컬렉션에 대한 선형 액세스보다 빠른 액세스가 가능합니다. 이러한 연결 목록은 일반적으로 AVL 트리 와 같은 균형 잡힌 트리를 기반으로합니다. 많은 Prolog 시스템과 함께 제공되는 library(assoc)
라는 공개 도메인 라이브러리가 있으며 요소를 컬렉션에 삽입, 페치 및 변경하기위한 O (log (N)) 연산을 제공합니다.
자귀
매우 높은 수준에서 Prolog는 용어 라는 단일 데이터 유형 만 가지고 있습니다. 프롤로그에서는 모든 데이터가 프롤로그 용어로 표시됩니다. 용어는 유도 적으로 정의됩니다.
- 원자 는 용어입니다. 원자의 예는
x
,test
및'quotes and space'
입니다. - 변수 는 용어입니다. 변수는 대문자 또는
_
합니다. - 정수 및 부동 소수점 숫자는 용어입니다. 예 :
42
및42.42
. - 다음 화합물 용어 유도 정의되는 용어이다 경우
T1
,T2
, ...T_n
용어는 다음 F (T1
,T2
, ...T_n
) F가 펑의라고하는 용어는, 또한 복합 용어.
라이브러리 (레코드)를 사용하여 명명 된 필드의 용어
[record][1]
라이브러리는 명명 된 필드로 복합 용어를 생성하는 기능을 제공합니다. 지시문 :- record/1 <spec>
은 <spec>
정의 된 용어의 필드를 초기화, 설정 및 가져 오는 술어의 집합으로 컴파일합니다.
예를 들어, 명명 된 필드 x
와 y
로 point
데이터 구조를 정의 할 수 있습니다.
:- use_module(library(record)).
:- record point(x:integer=0,
y:integer=0).
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
?- default_point(Point), point_x(Point, X), set_x_of_point(10, Point, Point1).
Point = point(0, 0),
X = 0,
Point1 = point(10, 0).
?- make_point([y(20)], Point).
Point = point(0, 20).
?- is_point(X).
false.
?- is_point(point(_, _)).
false.
?- is_point(point(1, a)).
false.
?- is_point(point(1, 1)).
true.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */