Обработка опции SWI-Prolog - PullRequest
4 голосов
/ 02 августа 2011

Я использую SWI-Prolog, и меня смущает, почему библиотека опций будет записана для получения следующих выходных данных:

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

Я ожидаю, что A = 1 ... Хотя, просматривая код библиотеки опций, этот результат явно предназначен ( git link ), но почему это не ошибка?

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), !.

Ответы [ 2 ]

4 голосов
/ 02 августа 2011

Поскольку memberchk / 2 (который является полудетерминированным, то есть успешным не более одного раза) используется в коде, который вы цитируете, недетерминированность (A = 1; A = 2; и т. Д.) Выглядит явно не предназначен.Во всяком случае, противоречивые варианты могут вызвать ошибку домена, нет?

3 голосов
/ 02 августа 2011

Документация гласит Синтаксис имени = значения устарел в пользу синтаксиса имени (значения).

Представляется разумным, что это будет представлено в коде library(option) путем проверкисначала для предпочтительной формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...