모든 해
모든 해
목표의 모든 해를 수집하는 술어들을 설명해요.
본문
소개
때로는 목표의 모든 해를 수집하는 것이 유용해요. 반복적으로 백트래킹하고 해 목록을 점차 구축함으로써 할 수 있어요. 이 과정을 자동화하기 위해 다음 내장 술어들이 제공돼요.
이 절에서 설명하는 내장 술어들은 인자 Goal에 call/1(7.2.3절)을 호출해요. 효율성이 중요하고 Goal이 복잡할 때는 나중에 컴파일할 수 있는 보조 술어를 정의하고 Goal이 이 술어를 호출하게 하는 것이 좋아요.
findall/4, findall/3
Templates
findall(?term, +callable_term, ?list, ?term)
findall(?term, +callable_term, ?list)
Description
findall(Template, Goal, Instances)는 Instances가 다음에 의해 인스턴스화될 변수 X의 값 리스트와 통일되면 성공해요. X는 Template이나 Goal에는 나타나지 않고, X의 모든 변수를 새 변수로 체계적으로 대체한 후 call(Goal), X = Template의 연속적인 재실행에 의해 인스턴스화되어요. 따라서 Instances 리스트의 순서는 증명이 발견되는 순서와 일치해요.
findall(Template, Goal, Instances, Tail)은 findall/3의 차이 리스트 버전이에요. 결과는 차이 리스트 Instances - Tail이에요. 따라서 findall(Template, Goal, Instances)는 findall(Template, Goal, Instances, [])와 동일해요.
Errors
Goal이 변수 -instantiation_errorGoal이 변수도 callable 항도 아님 -type_error(callable, Goal)Goal의 술어 표시자Pred가 기존 프로시저에 해당하지 않고unknownProlog 플래그의 값이error임(8.22.1절) -existence_error(procedure, Pred)Instances가 부분 리스트도 리스트도 아님 -type_error(list, Instances)Tail이 부분 리스트도 리스트도 아님 -type_error(list, Tail)
Portability: findall/3은 ISO 술어. findall/4는 GNU Prolog 술어.
bagof/3, setof/3
Templates
bagof(?term, +callable_term, ?list)
setof(?term, +callable_term, ?list)
Description
bagof(Template, Goal, Instances)는 Goal의 자유 변수의 각 서로 다른 인스턴스화에 대해 Goal의 해 집합을 리스트로 조립해요. 각 리스트의 요소는 해 순서지만, 각 리스트가 발견되는 순서는 정의되지 않아요. 이 술어는 백트래킹 시 재실행 가능해요.
자유 변수 집합: bagof/3는 Goal의 자유 변수에 따라 Goal의 해를 그룹화해요. 이 집합은 Goal에 나타나지만 Template에는 나타나지 않는 모든 변수에 해당해요. Goal의 추가 변수를 제외하는 것이 유용할 때가 있어요. 이를 위해 bagof/3는 T^Goal 형태의 목표를 인식하고 T에 나타나는 모든 변수를 자유 변수 집합에서 제외해요. (^)/2는 존재 양화사로 볼 수 있어요(X^Goal의 논리적 읽기는 "Goal이 참인 X가 존재한다"). bagof/3(및 setof/3) 밖에서 이 존재 양화사 사용은 불필요하며 인식되지 않아요. (^)/2는 미리 정의된 중위 연산자예요(8.14.10절).
setof(Template, Goal, Instances)는 bagof(Template, Goal, I), sort(I, Instances)와 동일해요. 그러면 각 리스트는 정렬된 리스트예요(중복 요소는 제거됨).
구현 관점에서 setof/3는 bagof/3만큼 빠르고, 두 술어 모두 in-place(즉 파괴적) 정렬(8.20.15절)을 사용하며 같은 양의 메모리를 요구해요.
Errors
Goal이 변수 -instantiation_errorGoal이 변수도 callable 항도 아님 -type_error(callable, Goal)Goal의 술어 표시자Pred가 기존 프로시저에 해당하지 않고unknownProlog 플래그의 값이error임(8.22.1절) -existence_error(procedure, Pred)Instances가 부분 리스트도 리스트도 아님 -type_error(list, Instances)
Portability: ISO 술어.