Альтернатива string_upper / 2 - PullRequest
0 голосов
/ 29 апреля 2018

Машина, на которой мой код должен работать, по некоторым причинам не знает предикат string_upper/2. Есть ли альтернативы? В конце концов, как будет выглядеть код для этого предиката?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Пример, который вы привели в комментариях, на самом деле не строка, а пара атомов. Поскольку вы уже решили использовать upcase_atom/2, в коде, который вы удалили из своего поста, я бы отметил, что эта встроенная функция работает только в одном направлении, то есть, если первый аргумент является атомарным. Рассмотрим следующие запросы:

?- upcase_atom(bo,'BO').   % Is 'BO' the uppercase version of bo?
true.                      % Yes, it is.

?- upcase_atom(bo,B).      % What's the uppercase version of bo?
B = 'BO'.                  % It's 'BO'

?- upcase_atom(B,'BO').    % What atom has 'BO' as uppercase version?
ERROR: upcase_atom/2: Arguments are not sufficiently instantiated

?- upcase_atom(B,1).       % What atom has 1 as uppercase version?
ERROR: upcase_atom/2: Arguments are not sufficiently instantiated

Ваш пример запроса из удаленного кода ?- divideIt(a-b).. Атом a объединяется с переменной V в заголовке правила divideIt/1. Затем Пролог называет первую цель upcase_atom(V,ve), которая должна завершиться неудачей, поскольку атом ve не является заглавной версией атома a. Следовательно, ваш пример запроса также не выполняется. Если вы примените следующие незначительные изменения к своему предикату, он даст желаемый результат:

divideIt(V-W) :-
   upcase_atom(V,Ve),     % <- Ve (=variable) instead of ve (=atom)
   write(Ve),
   write('-'),            % <- '-' instead of "-"
   upcase_atom(W,We),     % <- We (=variable) instead of we (=atom)
   write(We).

?- divideIt(a-b).
A-B
true.
0 голосов
/ 29 апреля 2018

Разбейте строку на список кодов символов. Затем преобразуйте эти коды в соответствующий код в верхнем регистре, если необходимо, прежде чем восстанавливать строку. Для более полного ответа потребуется знать, какой пролог вы используете, его доступные предикаты и как он представляет строки.


Возможно, вы захотите ознакомиться с обработкой символов, Unicode и строк в Прологе. Для этого в реализации SWI-Prolog есть хорошая документация:

Как традиционно (Эдинбург), пролог ISO & SWI обрабатывает символы: 4.2. Представление символов

Как прологи ISO и SWI поддерживают Unicode 2.16.1.8 Источник Unicode Prolog

Как у SWI есть конкретный объект строкового типа, который использует кавычки для их обозначения: 5.2 Тип строки и ее синтаксис в двойных кавычках

...