2017-03-07 1 views
2

프롤로그 조건자를 DCG 코드로 변환하려고합니다. 문법 langage에 익숙하다 할지라도 DCG가 어떻게 목록과 함께 작동하는지 그리고 어떻게 사용해야하는지 이해하는 데는 몇 가지 어려움이 있습니다.프롤로그에서 목록 사용 DCG

cleanList([], []). 
cleanList([H|L], [H|LL]) :- 
    number(H), 
    cleanList(L, LL), 
    !. 
cleanList([_|L], LL) :- 
    cleanList(L, LL). 

그것은 숫자가 아닌 요소를 제거하는 간단한 조건입니다 :

사실이 내 조건입니다. 나는 DCG에서 같은 행동을하고 싶습니다.

cleanList([]) --> []. 
cleanList([H]) --> {number(H)}. 
cleanList([H|T]) --> [H|T], {number(H)}, cleanList(T). 

이 잘못 또는 무엇을없는 걸 설명 할 수 있는가 :

나는 (분명히 작동하지 않습니다)처럼 뭔가를 시도?

감사합니다.

+0

하나의 큰 문제 렘은'... -> [H | T], ...'입니다. DCG가 시퀀스를 읽고 '[H | T]'가 임의의 길이를 가지기를 원한다. 왜 그 용어에 'T'를 포함 시켰는지 확실치 않습니다. 'cleanList (T)'에 대한 재귀 호출은 이미 입력에서'T'를 스캔합니다. – lurker

+0

오, 그래! 답장을 보내 주셔서 감사합니다. DCG가 시퀀스를 반복적으로 읽는 방법을 이해하지 못했습니다. 지금은 괜찮습니다. – Naeoth

답변

1

DCG 표기법의 목적은 정확히 입니다. 이상을 숨기거나 암시 적으로 지정하면 토큰 목록이됩니다.

cleanList([]) --> []. 
cleanList([H|T]) --> [H], {number(H)}, !, cleanList(T). 
cleanList(L) --> [_], cleanList(L). 

스타일 참고 : 그래서, 코드를보다 효율적으로 할 수

cleanList([]) --> []. 
cleanList([H|T]) --> [H], {number(H)}, cleanList(T). 
cleanList(L) --> [H], {\+number(H)}, cleanList(L). 

과 같아야합니다 Prologgers 할 것은, 낙타 :) 또한

clean_list([]) --> []. 
etc... 

을 피하기 위해 선호 I 더 컴팩트 한 코드를 선호합니다 :

clean_list([]) --> []. 
clean_list(R) --> [H], {number(H) -> R = [H|T] ; R = T}, clean_list(T). 
+0

나는 대답의 근처에 있음을 알고, 당신의 정확성과 조언에 감사드립니다! – Naeoth