Prolog Language
차이점 목록
수색…
소개
Prolog의 차이 목록은 한 점까지 목록 구조를 아는 개념을 나타냅니다. 술어의 완전한 평가가 끝날 때까지 목록의 나머지는 언 바운드 상태로 둘 수 있습니다. 끝이 알려지지 않은 목록을 열린 목록 이라고하며 구멍으로 끝납니다. 이 기법은 복잡한 구문이나 문법을 검증하는 데 특히 유용합니다.
잘 알려진 Definite Clause Grammars (DCG)는 Difference Lists를 사용하여 후드에서 작동합니다.
기본 사용법
술어 sumDif/2
생각해 봅시다. 목록 구조가 여러 제약 조건과 일치하는지 확인해보십시오. 첫 번째 용어는 분석 할 목록을 나타내며 두 번째 용어는 첫 번째 목록의 일부를 보유하는 다른 목록을 우리 제약 조건에서 알 수 없습니다.
데모를 위해 sumDif/2
는 n 개의 정수를 더하는 산술 표현식을 인식합니다.
sumDif([X, +|OpenList], Hole) :-
integer(X),
sumDif(OpenList, Hole).
유효성을 검사 할 목록의 첫 번째 요소는 정수 (여기에는 X
) 뒤에 추가 기호 ( +
)가 오는 것을 알 수 있습니다. 나중에 처리해야하는 목록 ( OpenList
)의 나머지 부분은 해당 수준에서 유효성이 확인되지 않은 상태로 유지됩니다. Hole
은 검증 할 필요가없는 목록의 일부를 나타냅니다.
술어 sumDif/2
에 대한 또 다른 정의를 sumDif/2
산술 표현식의 유효성 검증을 완료 sumDif/2
.
sumDif([X|Hole], Hole) :-
integer(X).
우리는 열린리스트의 시작 부분에 X
라는 정수를 직접 기대합니다. 흥미롭게도 Hole
의 나머지 부분은 알려지지 않은 상태로 남아 있으며 차이점 목록의 전체 목적입니다. 목록의 구조는 한 지점까지 알려져 있습니다.
마지막으로 누락 된 부분은 목록 평가시에옵니다.
?- sumDif([1,+,2,+,3], []).
true
이것은 술어를 사용하여 목록의 끝 부분이 언급 된 곳으로, 여기 []
는 목록에 추가 요소가 들어 있지 않음을 나타냅니다.
산술 표현식 평가
괄호를 사용하여 덧셈, 곱셈을 수행 할 수있는 문법을 정의합시다. 이 예제에 더 많은 가치를 부여하기 위해 산술 표현식의 결과를 계산할 것입니다. 문법 요약 :
표현 → 시간
표현식 → 시간 '+'표현
시대 → 요소
시간 → 요소 '*'회
요소 → "정수"
요소 → '('표현 ')'
목록, 구멍 및 산술 표현식의 값을 열어야하기 때문에 모든 조건부는 3의 값을가집니다.
expression(Value, OpenList, FinalHole) :-
times(Value, OpenList, FinalHole).
expression(SumValue, OpenList, FinalHole) :-
times(Value1, OpenList, ['+'|Hole1]),
expression(Value2, Hole1, FinalHole),
plus(Value1, Value2, SumValue).
times(Value, OpenList, FinalHole) :-
element(Value, OpenList, FinalHole).
times(TimesValue, OpenList, FinalHole) :-
element(Value1, OpenList, ['*'|Hole1]),
times(Value2, Hole1, FinalHole),
TimesValue is Value1 * Value2.
element(Value, [Value|FinalHole], FinalHole) :-
integer(Value).
element(Value, ['('|OpenList], FinalHole) :-
expression(Value, OpenList, [')'|FinalHole]).
홀의 원리와 값을 계산하는 방법을 올바르게 설명하기 위해 두 번째 절의 expression
.
expression(SumValue, OpenList, FinalHole) :-
times(Value1, OpenList, ['+'|Hole1]),
expression(Value2, Hole1, FinalHole),
plus(Value1, Value2, SumValue).
공개 목록은 술어 OpenList
로 표시됩니다. 유효성을 검사하는 첫 번째 요소 는 더하기 기호 ( +
) 앞에 오는 것 입니다. 첫 번째 요소의 유효성을 검사하면 추가 기호와 Hole1
이라는 목록이 계속 Hole1
. 우리는 Hole1
이 검증 할 다음 요소이며 또 다른 expression
이 될 수 있음을 알고 있으므로 Hole1
은 술어 expression
주어진 용어입니다.
이 값은 항상 첫 번째 용어로 표현됩니다. 이 절에서는 Value1
(더하기 기호 앞에 오는 모든 것)과 Value2
(더하기 기호 뒤에 오는 모든 것)의 합으로 정의됩니다.
마지막으로 표현식을 평가할 수 있습니다.
?- expression(V, [1,+,3,*,'(',5,+,5,')'], []).
V = 31