2016-11-26 1 views
0

내가이 T-> UU을 가정하고 알고, 첫 번째 parse_U는 "aabb"을 구문 분석, 그리고 두 번째 parse_U이 마지막 "ab"을 구문 분석,하지만이 작업을 수행하는 방법을 알아낼 수 없습니다 추가와 함께. a으로 시작하고 b으로 끝나는 하위 목록 만 가져올 수 있지만 원하는 결과가 아닙니다.파싱 연속 비 터미널

도움을 주시면 감사하겠습니다.

+0

코드에 문제가 있으면 – max66

답변

1

Prolog에서 구문 분석을 수행 할 때는 가능한 경우 DCG (Definite Clause Grammar)를 사용하는 것이 좋습니다. 내가 잘못 아니에요 경우

, 문법은 단순히

isS --> isT. 
isS --> isV. 

isT --> isU, isU. 

isU --> [a], isU, [b]. 
isU --> [a, b]. 

isV --> [a], isV, [b]. 
isV --> [a], isW, [b]. 

isW --> [b], isW, [a]. 
isW --> [b, a]. 

될 수 있고 L 구문 분석하는 순서와 목록입니다 isS(L, [])를 호출 할 수 있습니다.

isS([a,a,b,b,a,b], []) 

당신이 진정한 받아야 호출

.

--- 편집 ---

이 숙제이고 우리가 사용 할 수 없습니다 "->"-->의 특별한 아무것도 DGC에 없다

(사용) 구문; 그것은 일반적인 구문의 단지 semplification입니다. 당신이 진정한 받아야

is_S([a,a,b,b,a,b], []) 

를 호출 : (규칙 이름에 추가 undescores주의)

is_S(Lin, Lout) :- is_T(Lin, Lout). 
is_S(Lin, Lout) :- is_V(Lin, Lout). 

is_T(Lin, Lout) :- is_U(Lin, Lmid), is_U(Lmid, Lout). 

is_U([a | Tin], Lout)  :- is_U(Tin, [b | Lout]). 
is_U([a, b | Lout], Lout). 

is_V([a | Tin], Lout)  :- is_V(Tin, [b | Lout]). 
is_V([a | Tin], Lout)  :- is_W(Tin, [b | Lout]). 

is_W([b | Tin], Lout)  :- is_W(Tin, [a | Lout]). 
is_W([b, a | Lout], Lout). 

내가 잘못 아니에요 경우

, 당신은 위와 같이 DCS 구문을 작성할 수 있습니다.

+0

@Solace에게 표시해야합니다. 내 대답을 개선하여 내 솔루션의 전통적인 (no -> 구문) 버전을 제안했습니다. – max66

+0

그것은 작동합니다! 정말 고맙습니다!!! – Solace