2012-05-16 4 views
0

Prolog에서 목록을 검색하려고하지만 특정 위치에서 바로 시작하고 싶습니다. 그 지루한 재귀 검색을해야합니까?Prolog에서 목록 검색

감사합니다.

+2

목록은 Prolog에서 순차적입니다. 목록 중간 위치에 대한 참조가 없다면 순차적 인 참수 (일명 "지루한 재귀 검색")를 제외하고는 액세스 할 수 없습니다. – Amadan

+0

대단히 고마워요! –

답변

0

당신은 N의 free_vars를 사용하여 N 위치를 건너 뛰고/(3) 목록 '헤더를 제거하는 추가 할 수 있습니다 :

?- [user]. 
|: find(Needle, Haystack, Skip) :- 
|:  length(Header, Skip), 
|:  append(Header, Actual, Haystack), 
|:  memberchk(Needle, Actual). 
|: % user://1 compiled 0,04 sec, 2 clauses 
true. 

?- find(3-X,[1-alfa,2-beta,3-gamma,4-delta,1-abba,2-bridge],1). 
X = gamma. 

?- find(3-X,[1-alfa,2-beta,3-gamma,4-delta,1-abba,2-bridge],3). 
false. 

?- find(3-X,[1-alfa,2-beta,3-gamma,4-delta,1-abba,2-bridge],2). 
X = gamma. 

을에 목록이 한 번 수행 더 나은 length(Header, Skip)을 구축하는 많은 검색이있는 경우 ..