Пример, который вы привели в комментариях, на самом деле не строка, а пара атомов. Поскольку вы уже решили использовать 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.