수색…


소개

Prolog의 차이 목록은 한 점까지 목록 구조를 아는 개념을 나타냅니다. 술어의 완전한 평가가 끝날 때까지 목록의 나머지는 언 바운드 상태로 둘 수 있습니다. 끝이 알려지지 않은 목록을 열린 목록 이라고하며 구멍으로 끝납니다. 이 기법은 복잡한 구문이나 문법을 검증하는 데 특히 유용합니다.

잘 알려진 Definite Clause Grammars (DCG)는 Difference Lists를 사용하여 후드에서 작동합니다.

기본 사용법

술어 sumDif/2 생각해 봅시다. 목록 구조가 여러 제약 조건과 일치하는지 확인해보십시오. 첫 번째 용어는 분석 할 목록을 나타내며 두 ​​번째 용어는 첫 번째 목록의 일부를 보유하는 다른 목록을 우리 제약 조건에서 알 수 없습니다.

데모를 위해 sumDif/2n 개의 정수를 더하는 산술 표현식을 인식합니다.

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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow