2017-12-08 10 views
3

저는 ProLog를 처음 사용하고 있으며 목록에 대한 재귀를 이해하는 데 어려움을 겪고 있습니다.SWI Prolog - 목록 재귀

나는이 연습에 붙어있다. 기본적으로 어휘가 주어진다면 나는 이탈리아 숫자의리스트를 영어 숫자로 변환 할 필요가있다.

이것은 내 KB입니다.

tran(uno, one). 
tran(due, two). 
tran(tre, three). 
tran(quattro, four). 
tran(cinque, five). 
tran(sei, six). 
tran(sette, seven). 
tran(otto, eight). 
tran(nove, nine). 

listran(L,[]). 
listran(L,[H|T]) :- tran(H,E), listran([E|L],T). 

이 프로그램은 역순으로 번역 된 목록을 제공해야합니다. 그러나, 그것은 단지 내가 통과 할 때 사실를 출력합니다

?- listran(X, [uno, due, tre]). 

내가 그것을 추적하기 위해 노력하고 끝이 제거에 보인다했습니다 ?? 내 번역 된 목록의 모든 요소. 이것이 추적 출력입니다.

[trace] ?- listran(X,[uno,due,tre]). 
    Call: (8) listran(_5566, [uno, due, tre]) ? creep 
    Call: (9) tran(uno, _5820) ? creep 
    Exit: (9) tran(uno, one) ? creep 
    Call: (9) listran([one|_5566], [due, tre]) ? creep 
    Call: (10) tran(due, _5826) ? creep 
    Exit: (10) tran(due, two) ? creep 
    Call: (10) listran([two, one|_5566], [tre]) ? creep 
    Call: (11) tran(tre, _5832) ? creep 
    Exit: (11) tran(tre, three) ? creep 
    Call: (11) listran([three, two, one|_5566], []) ? creep 
    Exit: (11) listran([three, two, one|_5566], []) ? creep 
    Exit: (10) listran([two, one|_5566], [tre]) ? creep 
    Exit: (9) listran([one|_5566], [due, tre]) ? creep 
    Exit: (8) listran(_5566, [uno, due, tre]) ? creep 
true. 

누군가가이 작은 문제를 이해하도록 도와 줄 수 있습니까?

미리 감사드립니다.

답변

5

문제는 모두 절에 ​​있습니다

여기
listran(L,[]). 
listran(L,[H|T]) :- tran(H,E), listran([E|L],T). 

당신은 진술한다 : H를 번역하고 L의 머리에 배치하고 상태를 명시 적으로 필요,이 모든 L을 위해 보유하고, 계속 그것의 현재 머리 여기

listran([],[]). 
listran([E|T1],[H|T]) :- tran(H,E), listran(T1,T). 

당신이 첫 번째 목록의 머리를 E라고하고 두 목록이 비어있는 기본 케이스까지 나머지 계속 : L은 E가 E를 추가하지 않습니다.

3

흥미로운 (그리고 "prologish") 방법은 사용하는 것입니다 DCG :

tran(uno) --> [one]. 
tran(due) --> [two]. 
tran(tre) --> [three]. 
tran(quattro) --> [four]. 
tran(cinque) --> [five]. 
tran(sei) --> [six]. 
tran(sette) --> [seven]. 
tran(otto) --> [eight]. 
tran(nove) --> [nine]. 

listran(In,Out) :- 
    phrase(trans(In), Out). 

trans([]) --> []. 

trans([H|T]) --> tran(H), trans(T).