모든 해

모든 해

목표의 모든 해를 수집하는 술어들을 설명해요.

출처: GNU Prolog Manual - All solutions

본문

소개

때로는 목표의 모든 해를 수집하는 것이 유용해요. 반복적으로 백트래킹하고 해 목록을 점차 구축함으로써 할 수 있어요. 이 과정을 자동화하기 위해 다음 내장 술어들이 제공돼요.

이 절에서 설명하는 내장 술어들은 인자 Goalcall/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_error
  • Goal이 변수도 callable 항도 아님 - type_error(callable, Goal)
  • Goal의 술어 표시자 Pred가 기존 프로시저에 해당하지 않고 unknown Prolog 플래그의 값이 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/3Goal의 자유 변수에 따라 Goal의 해를 그룹화해요. 이 집합은 Goal에 나타나지만 Template에는 나타나지 않는 모든 변수에 해당해요. Goal의 추가 변수를 제외하는 것이 유용할 때가 있어요. 이를 위해 bagof/3T^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/3bagof/3만큼 빠르고, 두 술어 모두 in-place(즉 파괴적) 정렬(8.20.15절)을 사용하며 같은 양의 메모리를 요구해요.

Errors

  • Goal이 변수 - instantiation_error
  • Goal이 변수도 callable 항도 아님 - type_error(callable, Goal)
  • Goal의 술어 표시자 Pred가 기존 프로시저에 해당하지 않고 unknown Prolog 플래그의 값이 error임(8.22.1절) - existence_error(procedure, Pred)
  • Instances가 부분 리스트도 리스트도 아님 - type_error(list, Instances)

Portability: ISO 술어.

더 알아보기