пролог печать списков - PullRequest
       12

пролог печать списков

0 голосов
/ 03 ноября 2010
?-mod5(X,[a,16,b,c(5),[[12]],8]).  
X = [a,1,b,c(5),[[12]],3].  

Нецелое число должно оставаться нетронутым.Однако, в случае [[12]], поскольку 12 является значением ASCII для "\ f" (подача формы), он выводит [["\ f"]], когда то, что я хочу, чтобы вывести [[12]]как есть.Как я могу предотвратить это?

1 Ответ

1 голос
/ 04 ноября 2010

РЕДАКТИРОВАТЬ: Сначала я предположил, что проблема была в реализации, поэтому я предложил один ниже.Оказывается, учитывая, что OP позже сообщил, что это NU-Prolog, что ответ, по-видимому, заключается просто в поведении по умолчанию NU-Prolog , как согласно этому руководству, раздел 3.7 :

"Списки обычно печатаются как строки, если каждый элемент списка представляет собой целое число, для которого isPrint/1 имеет значение true."

Как isPrint/1обозначается как встроенный для NU-Prolog, возможно, он не может быть переопределен для обеспечения другого поведения - возможно, NU-Prolog можно настроить для изменения поведения по умолчанию в этом случае, но я не уверен.

Ниже приведена реализация mod5/2, которая теперь не имеет отношения к решению:


Если предикат mod5/2 предназначен для получения (в качестве второго аргумента) спискатерминов и вернуть (в первой позиции аргумента) список терминов в том же порядке, но где каждое число N заменяется значением N mod 5, тогда я предлагаю вам попробовать:

mod5([], []).
mod5([X|Xs], [Y|Ys]) :-
    isInt(Y), !,
    X is Y mod 5,
    mod5(Xs, Ys).
mod5([X|Xs], [X|Ys]) :-
    mod5(Xs, Ys).

Обратите внимание на защитные подцели isInt(Y), !, (NU-PROLOG) во втором пункте mod5/2;числовой расчет mod через is для замены Y произойдет только тогда, когда Y является числовым;в противном случае он пропускается через нетронутый последним предложением mod5 (как X).

Выполнение этого в вашем примере с использованием SWI-PROLOG дает:

?- mod5(X,[a,16,b,c(5),[[12]],8]).  
X = [a, 1, b, c(5), [[12]], 3] ;
false.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...