2012-12-13 3 views
2

Prolog 프로그래머는 일반적으로 문자열의 패턴을 일치시키기 위해 정규 표현식 대신 DCG를 사용한다는 것을 알고 있습니다. Perl에서 쓸 수 있습니다.작은 일반 표현식을 DCG로 변환

Prolog에서 동일한 패턴이 어떻게 일치합니까?

답변

1

난 다음 정규식 검색이 방법으로 우리는 대신에 단일 문자의 원자를 일치

?- 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 

우리는 하나의 문자 (그것의 프롤로그에서 문자열과 일치하는 '하드'(더 쉽게)이 될 수 대신에 문자 코드 목록)

+0

답은 기본적으로'rexp (C) -> [C] .'로되어 있습니다. – false

+0

여전히 기본값입니다. 'phrase (rexp ([]), Xs) .' ... 그리고 다른 많은 문제를 시도하십시오. – false

관련 문제