2014-10-06 2 views
1

누적자를 이해하려고하는데이 구현에 포함해야합니다. 간단한 목록을 검색하는 방법을 알아 냈습니다. 나는이 중첩 된 목록에 대한 작동하게 할 수있는 방법을 이제프롤로그 누적 기와 함께 목록의 요소 찾기

find(Element,[],A,A). 
find(Element, [H|Tail], A, N) :- Element = H, A1 is A + 1, 
find(Element, Tail, A1, N). 
find(Element, [H|Tail], A, N) :- find(Element, Tail, A, N). 

: 이 주어진 요소의 발생 수를 계산?

당신은 단순히 H이 목록뿐만 아니라 경우, 발생 횟수가 먼저 계산되도록 일치 프로그램에 다른 항목을 추가해야합니다

답변

1

다음 이전 Element (두 번째 절)의 평등을 배치하여

find(Element,[],A,A). 
find(Element, [Element|Tail], A, N) :- 
    !, 
    A1 is A + 1, 
    find(Element, Tail, A1, N). 
find(Element,[[H|T]|Tail],A,N) :- 
    !, 
    find(Element,[H|T],A,R), 
    find(Element,Tail,R,N). 
find(Element, [H|Tail], A, N) :- 
    find(Element, Tail, A, N). 

목록 재귀를 사용하면 목록의 목록을 검색 할 수도 있습니다. 즉 :

find([1,2],[[1,2],[3],4,[1,2]]) 

돌아올 2입니다.

자르기 (!)를 사용하여 Prolog가 역 추적하지 못하도록합니다.


힌트 : 몸 (Element = H) 가능한 경우에 통합하지 않습니다. 동일한 변수를 머리에 다시 사용하기 만하면됩니다 (find(Element,[Element|Tail],A,N)). 많은 Prolog 컴파일러는 첫 번째 경우보다 훨씬 더 나은 최적화를 수행 할 수 있습니다. 사용 삭감 :


힌트

. Prolog가 비 결정적 (non-determinism)을하지 못하도록 컷을 더 자주 사용할 수 있습니다. 당신이 [5,1,2,5]5의 발행 수를 계산하는 경우 예를 들어 당신이 H같지Element에 있음 마지막 절에 지정하지도 2, 10 가지고 올 수 있습니다. 이전 절에서 잘라내기를 사용하면 Prolog 인터프리터가이 작업을 되돌릴 수 없습니다. |, 찾기 (요소, 꼬리, T, N) 찾기 ([T H, A, T 요소) :

+0

나는 당신의 중간 기간에 실수가 있다고 생각합니다. 나는 그것을 나누는 방법을 얻지 만, 마지막 변수와 마지막 변수는 [H | T]의 T와 일치해서는 안됩니다. 내가 맞습니까? – user3614293

+0

사실,'T'가 아닌 다른 변수를 사용해야합니다. 미안하지만 요점을 얻길 바래? 결정된. –

+0

@ user3614293 : 왜 'find' 술어를 역 추적해야합니까? 그들은 단지'find' 호출을 막을 것입니다. 역 추적 할 이유가 없으므로 (알고리즘은 "직선적"입니다), 이것이 유용한 시나리오는 없습니다. –