2
Prolog 프로그래머는 일반적으로 문자열의 패턴을 일치시키기 위해 정규 표현식 대신 DCG를 사용한다는 것을 알고 있습니다. Perl에서 쓸 수 있습니다.작은 일반 표현식을 DCG로 변환
Prolog에서 동일한 패턴이 어떻게 일치합니까?
Prolog 프로그래머는 일반적으로 문자열의 패턴을 일치시키기 위해 정규 표현식 대신 DCG를 사용한다는 것을 알고 있습니다. Perl에서 쓸 수 있습니다.작은 일반 표현식을 DCG로 변환
Prolog에서 동일한 패턴이 어떻게 일치합니까?
난 다음 정규식 검색이 방법으로 우리는 대신에 단일 문자의 원자를 일치
?- phrase(rexp([a+, b*, range(c,2,4), d]), [a,c,c,d]),
writeln(matched).
참고가 될 수 this 대답
:- op(100, xf, *).
:- op(100, xf, +).
rexp(C) --> [C].
rexp([T|Ts]) --> rexp(T), rexp(Ts).
rexp([]) --> [].
rexp(eps) --> [].
rexp(_*) --> [].
rexp(R*) --> rexp(R), rexp(R*).
rexp(R+) --> rexp(R), rexp(R*).
rexp((R1|R2)) --> (rexp(R1) ; rexp(R2)).
rexp(range(R,N,M)) -->
{between(N,M,L),
length(D,L),
maplist(copy_term(R),D)
}, rexp(D).
을 확장했습니다.
편집 거짓 '코멘트 후, 내가 처음 절은
?- phrase(rexp([a+]), [a+]).
true ;
실제로 예를 들어 피하기 위해
rexp(C) --> {atomic(C)}, [C].
을 읽어야한다고 생각, 보정 후 우리는 예상 결과를 가지고 :
?- phrase(rexp([a+]), [a+]).
false.
완료 편집
정규 표현식을 패턴을 해석하는 것은
% I prefer the equivalent clause below
% p1 --> "a", p1 ; "a", p2.
p1 --> "a", (p1 ; p2).
p2 --> "b", p2 ; p3.
p3 --> ("cc" ; "ccc" ; "cccc"), "d".
가 여기에
?- phrase(p1, "accd").
true
우리는 하나의 문자 (그것의 프롤로그에서 문자열과 일치하는 '하드'(더 쉽게)이 될 수 대신에 문자 코드 목록)
답은 기본적으로'rexp (C) -> [C] .'로되어 있습니다. – false
여전히 기본값입니다. 'phrase (rexp ([]), Xs) .' ... 그리고 다른 많은 문제를 시도하십시오. – false