Измените выходные значения по умолчанию в swi-prolog на true и false для оценки предиката.

Когда вы выполняете что-либо в прологе, вы можете видеть, что результат оценки выглядит следующим образом:

истинный

or

ложный

Я хотел бы изменить эти значения на персонализированные.

Основываясь на этом вопросе, Я увидел, что то, что я хочу, определено в файле messages.pl

где я обнаружил, что они определяются как:

query_result(no) -->            % failure
    [ ansi(truth(false), 'false.', []) ],
    extra_line.
query_result(yes(true, [])) -->      % prompt_alternatives_on: groundness
    !,
    [ ansi(truth(true), 'true.', []) ],
    extra_line.

Я бы хотел, чтобы вместо получения false или true я мог получить <ERROR::> и <PASSED::> соответственно для своих модульных тестов.

Дополнительная информация

Я выполняю модульный тест для файла с именем adition.pl, состоящего исключительно из.

 my_add(A,B,Result):- number(A), number(B), is(Result,+(A,B)). 

Пытаться

:-['C:/Users/RuslanLopez/Documents/Prolog/adittion.pl'].
%:-['C:/Program Files/swipl/boot/messages.pl'].
:- begin_tests(my_add).
:- include(adittion).
%:- use_module($messages).
%:- include(messages).
error:-write('<ERROR::>'),nl.
passed:-write('<PASSED::>'),nl.

:- dynamic(user:query_result/1).

user:query_result(no) -->            % failure
        [ ansi(truth(false),'<ERROR::>', []) ].

user:query_result(yes(true, [])) -->      % prompt_alternatives_on: groundness
        !,
        [ ansi(truth(true),'<PASSED::>' , []) ].




test(my_add):-
        my_add(1,2,Result),
        Result =:= 3.

test(my_add) :-
        my_add(1,2,Result),
        Result \= 4.

:- end_tests(my_add).

Я понимаю, что более простым решением было бы перейти к файлу и изменить значение непосредственно там, но я действительно хотел бы внести изменения во время выполнения, чтобы изменить это пользовательское поведение только в моем модульном тесте, а не для всей системы.


person Ruslan López    schedule 01.01.2020    source источник
comment
Не могли бы вы просто call/1 предикат для проверки и печати соответственно на основе успеха или неудачи? (Кроме того, вы просмотрели Модульные тесты Prolog   -  person David Tonhofer    schedule 02.01.2020
comment
@DavidTonhofer да, однако, в консоли будет отображаться true или false, это то, что я хочу отключить, не создавая реплику.   -  person Ruslan López    schedule 03.01.2020
comment
Идея, кажется, состоит в том, чтобы изменить представление для пользователя, который работает в REPL интерпретатора, а не в специальном REPL. Это требование кажется излишне византийским и клиновидным?   -  person David Tonhofer    schedule 03.01.2020
comment
@DavidTonhofer Я не буду вызывать его из интерпретатора repl. Он должен запускаться внутри док-контейнера. Таким образом можно было бы добавлять упражнения по программированию на сайт codewars.com.   -  person Ruslan López    schedule 03.01.2020
comment
Можно ли запустить процесс Prolog и выполнить обмен запрос/ответ, используя PLTP (транспортный протокол Prolog), как описано здесь: Pengines: простое программирование веб-логики   -  person David Tonhofer    schedule 04.01.2020
comment
@DavidTonhofer, но я не хочу, чтобы это было интерактивным   -  person Ruslan López    schedule 04.01.2020
comment
Ну, это должно быть похоже на вызов JDBC или ODBC к базе данных SQL, верно? Вы не хотите изменять приглашение клиентской программы базы данных SQL, вы просто хотите выполнить запрос из вашей программы, получить взамен набор строк и обработать его любым способом. Это то же самое.   -  person David Tonhofer    schedule 04.01.2020
comment
@DavidTonhofer на самом деле всегда добавлялся терминатор SQL-запроса ;, и я хочу его удалить, и я хочу сделать это без изменения библиотеки, которая добавляет такой терминатор.   -  person Ruslan López    schedule 05.01.2020


Ответы (2)


Не надо. Вы хотите изменить центральную часть системы Пролога, а именно верхний уровень (цикл). Но вам понадобится этот верхний уровень для интерактивной диагностики и отладки вашей программы. Любое изменение верхнего уровня будет видно и в этом контексте. Верхний уровень — это результат многолетнего использования Пролога различными группами пользователей. Он содержит гораздо больше, чем ответы true и false. Просто попробуйте X = 1, или даже X = s(s(X)), или dif(X,2).

plunit — это пакет модульного тестирования, доступный для SWI, SICStus и некоторых других систем. Используйте его вместо этого или создайте собственный, основанный на его основе.

person false    schedule 02.01.2020
comment
Итак, вы говорите, что невозможно переопределить системный предикат на лету? (Контекст моего вопроса github.com/Codewars/codewars-runner-cli/issues /159 ) - person Ruslan López; 03.01.2020
comment
Практически никогда не бывает хорошей идеей переопределять системные предикаты. (Может быть, исключение, если вы хотите исправить неправильное определение. Но в противном случае, никогда). - person false; 03.01.2020
comment
так можно? - person Ruslan López; 03.01.2020
comment
Пожалуйста, прочтите руководство. То, что вы задаете в своем первоначальном вопросе, невозможно таким образом. Вы должны изменить исходный код, чтобы получить это. Удачи. - person false; 03.01.2020

Верхний уровень — это просто предикат prolog/0, который запускается при запуске интерпретатора Пролога. Параметры командной строки позволяют запускать другой предикат, или вам нужно изменить существующий код, если вы хотите использовать другой верхний уровень по умолчанию.

Я получил открытый исходный код верхнего уровня в своей системе Prolog, полностью написанный на самом Prolog. Он также может отображать решенные ограничения. Его открытый исходный код здесь:

Открытый исходный код: модуль "session"
время выполнения/session.p

Значения true и false интернационализируются через файлы свойств. Итак, в немецком вы видите «Ja» и «Nein», а в английском вы видите «Yes» и «No». Поскольку API интернационализации на самом деле не стандартизирован, вы найдете несколько пользовательских встроенных вызовов.

Файл свойств должен быть предварительно загружен с помощью этого оператора здесь:

:- sys_load_resource(runtime).

И значение для ключа, в зависимости от текущих языковых настроек, затем извлекается с помощью такой последовательности кода:

sys_show_assoc([], _) :-
   get_properties(runtime, P),
   get_property(P, 'query.yes', V),
   write(V).
person Mostowski Collapse    schedule 06.01.2020