2017-03-13 1 views
0

을 사용하여 Prolog에 술어 CleanList/3을 작성해야합니다.이 목록은 목록을 분석하고 번호가 제거되지 않은 모든 요소가 있지만 목록이 같은 새 목록을 반환합니다. 예를 들어DCG를 사용하여 목록에서 비 번호 제거

:

?- cleanList([1,2,d,67,3.2,'CSI2120',foo,5],LL). 
LL = [1, 2, 67, 3.2, 5]. 

나는 재귀 케이스 DCG을 구현하는 데 어려움을 겪고 기본 케이스를 썼다. 누군가 이걸로 나를 도울 수 있습니까?

자료 케이스 : 그것은이하는 모든 cleanlist/1의 인수가 비어있을 때 빈 목록을 반환하고, 아주 간단

cleanlist([]) --> []. 

:

cleanList(L,LL) :- cleanList(LL,L,[]),!. 
+2

귀하의 기본 케이스는 DCG하지 않고, 기본이 아니다. 기본 사례는 재귀 적이 지 않지만 기본, 최하위 수준의 관계를 제공해야합니다. 재귀 호출은 단지 2를 취하는 술어에 3 개의 인수를 사용합니다. – lurker

+1

'number (X)'가 숫자 인 경우에만'number (X)'가 성공한다는 사실을 사용할 수 있습니다. – lurker

답변

0

당신은 같은 기본 케이스를 정의하여 시작할 수 명부. 또한 절 정의 할 수 있습니다 : 그것은 숫자입니다 재귀 cleanlist/1 전화 IFF에 목록의 H의 머리를 유지

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

합니다.

예 :

?- phrase(cleanlist([1]) ,L). 
L = [1]. 

?- phrase(cleanlist([1,3]) ,L). 
L = [1, 3]. 

?- phrase(cleanlist([1,2,a,c,3]) ,L). 
L = [1, 2, 3]. 

?- phrase(cleanlist([1,2,a,c,3,m,k,l,o,"ABC",12]) ,L). 
L = [1, 2, 3, 12]. 

?- phrase(cleanlist([a,b]) ,L). 
L = []. 

?- phrase(cleanlist([A,1,b]) ,L). 
L = [1]. 
+0

감사합니다! cleanList/2에서 호출 할 때 cleanListDCG/3이 올바르게 작동하는 방식으로 작동하도록 변경할 수있는 방법이 있습니까? – user7630822

+0

예 위의 이름을 cleanlistDSG로 바꾸고 새 규칙을 추가하십시오 : cleanlist (L, L1) : - phrase (cleanlistDCG (L), L1). 질문 된 클린리스트/2 술어입니다 .... – coder

+0

도움을 주셔서 감사합니다. – user7630822

관련 문제