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