귀하의 Pred는 언 바운드 변수를 포함합니다. 첫 번째 반복에서 Pred를 호출하면 이러한 변수가 첫 번째 가능한 값에 바인딩됩니다. 재귀 적 단계에서 Pred는 이미 바운드 변수를 가지고 있으며 값을 변경할 수 없습니다. 그래서 ...이 솔루션은 작동하지 않습니다.
첫 번째 수준 (전화 : SWI - 프롤로그에서
추적 (나는 몇 가지 이유에 대한 항목/2/2 새 이름을 변경했다) (my_findall (A, B, 구성원 (P는 A, B), [p (1,2), p (3,4)]), L).
Call: (7) my_findall(_G819, _G820, member(p(_G819, _G820), [p(1, 2), p(3, 4)]), _G840) ? creep
Call: (8) lists:member(p(_G819, _G820), [p(1, 2), p(3, 4)]) ? creep
Exit: (8) lists:member(p(1, 2), [p(1, 2), p(3, 4)]) ? creep
우리는 p (A, B) = p (1,2)를 얻었다. 이 점 A는 1 바인딩에서, B는 2
^ Call: (8) not(item(1, 2)) ? creep
Call: (9) item(1, 2) ? creep
Fail: (9) item(1, 2) ? creep
^ Exit: (8) not(item(1, 2)) ? creep
확인에 결합 된 데이터베이스에 어떠한 항목 (1,2)이 없다.
^ Call: (8) assert(item(1, 2)) ? creep
^ Exit: (8) assert(item(1, 2)) ? creep
지금 항목 (1,2)이 참입니다. 재귀 호출 :
Call: (9) lists:member(p(1, 2), [p(1, 2), p(3, 4)]) ? creep
^^^^^^^
밑줄 친 부분을 참조하십시오
Call: (8) my_findall(_L215, _L216, member(p(1, 2), [p(1, 2), p(3, 4)]), _L199) ? creep
는 이제 Pred를 가산 할 또 다른 솔루션을하자?
이 기법을 사용하려면 Pred를 복사하고 N과 P를 새로운 변수로 재귀 적으로 변경해야합니다. 매 반복마다 N과 P의 새 쌍을 "만들어야"합니다. copy_term/2 (http://www.swi-prolog.org/pldoc/doc_for?object=copy_term%2f2)를 확인하십시오.
어떤 프롤로그 인터프리터를 사용하고 있습니까? – liori
내장 된 findall은 findall/3 및 findall/4입니다. 어느 것을 구현하려고합니까? – Kaarel