2011-08-01 3 views
4
옵션 라이브러리는 다음과 같은 출력을 제공하기 위해 기록 될 것입니다 왜 SWI-프롤로그를 사용하여 혼란 스러워요하고

: 옵션을 통해 찾고 ...SWI - 프롤로그 옵션 처리

?- option(a(A), [a=1, a=2, a(3)]). 
A = 3. 
?- option(b(B), [b=1, b=2]). 
B = 1. 

내가 A = 1을 기대를 그러나 라이브러리 코드는이 결과가 명확하게 의도되어 있지만 (git link), 왜 이것이 버그가 아닌가? (; A = 2; A = 1 등) memberchk/2 인용 코드, 비 결정론에 사용되는 (즉, 반 결정, 그것은 기껏해야 한 번 성공)

option(Opt, Options) :-     % make option processing stead-fast 
     arg(1, Opt, OptVal), 
     nonvar(OptVal), !, 
     functor(Opt, OptName, 1), 
     functor(Gen, OptName, 1), 
     option(Gen, Options), 
     Opt = Gen. 
option(Opt, Options) :- 
     get_option(Opt, Options), !. 


get_option(Opt, Options) :- 
     memberchk(Opt, Options), !. 
get_option(Opt, Options) :- 
     functor(Opt, OptName, 1), 
     arg(1, Opt, OptVal), 
     memberchk(OptName=OptVal, Options), !. 

답변

3

설명서에 이름 (값) 구문을 사용하는 the Name = Value syntax is deprecated이 나와 있습니다.

먼저 선호 양식을 확인하여 library(option) 코드에 표시하는 것이 합당한 것처럼 보입니다.

4

때문에 보인다 명시 적으로 이 아니며이 아닙니다. 어떤 것이라도 모순되는 옵션은 도메인 오류를 발생시킬 수 있습니까?

+0

필자는 목록에서 첫 번째 일치 항목을 찾고 후속 일치 항목을 무시 (즉, 나중에 옵션 목록을 숨기는 옵션 목록에 새 옵션 추가)하고 semi-det하는 것에 대해 라이브러리를 용서할 수 있다고 생각합니다. 나는 단지 key (value)와 key = value 형태로 먼저 검색하는 것을 정당화 할 방법을 찾지 못한다. – DaveEdelstein