Пролог не работает как ожидалось - PullRequest
0 голосов
/ 14 сентября 2011

Я пытался определить функтор и напечатать каждый отдельный элемент списка в Прологе, но Пролог не печатает в правильном формате.

rint(L):-
    write(H).

вывод похож на
rint([a, s,v ,c]).
_L139
true.

Это то, чего я ожидаю достичь, позвонив функтору, любая помощь или мысль приветствуются, я новичок в Прологе и изучаю его.

?- rint([a,b,c,d]).

.(a, .(b, .(c, .(d, []))))

Ответы [ 2 ]

1 голос
/ 14 сентября 2011

Я думаю, что это должно быть

rint(L) :- write(L).

Также, если вы хотите .(a, .(b, .(c, .(d, [])))), а не [a, b, c, d] на выходе, используйте display:

rint(L) :- display(L).
0 голосов
/ 23 февраля 2016

Проблема в вашем правиле для rint.

В вашем определении сказано, что rint(L) успешно, если write(H) успешно.На этом этапе переводчик ничего не знает о H.Таким образом, он записывает значение, которое он не знает, поэтому вы видите _L139, внутреннее представление неинициализированной переменной.
Сделав это, write(H) успешно выполнено, истинно так что rint(L) верно.Переводчик говорит вам, что: true.


Чтобы определить свой собственный rint/1, не полагаясь на встроенные модули, такие как display/1, вам необходимо выполнить что-то вроде

rint([]) :-
    write([]).
rint([H|T]) :-
    write('.('),
    write(H),
    write(', '),
    rint(T),
    write(')').

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

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