Как написать одинарную кавычку (') в предикате записи в Прологе? - PullRequest
4 голосов
/ 04 декабря 2010

Я хочу добавить краткую информацию в начале программы, и я иду так:

message :-
    nl,nl,
    write('  To start type  '), nl,
    write(' ?- solve(Input1,Input2,Output3) '), nl.
:- message.

И это нормально ... но мне нужно написать ('? - решить (' Input1 ','Input2', Output3) '), nl, поэтому, когда я запускаю программу, она должна напечатать Для запуска введите? ', Выход 3)

заранее спасибо:)

1 Ответ

5 голосов
/ 04 декабря 2010

Избегайте цитаты с обратной косой чертой .

Например, для вывода одинарной одинарной кавычки:

?- write('\'').
'
true.

Как правило, вы должны, конечно, избегать побочных эффектов полностью . Хорошее решение - описать вывод с использованием DCG. Это делает его доступным для тестовых случаев , которые трудно записать, если вывод появляется только на терминале.

write/1 особенно редко используется. Если вам действительно нужно что-то вывести, используйте format/2. Это звучит страшно, если вы знаете DOS, но на самом деле это не так.

Важным преимуществом format/2 является то, что он позволяет удобно комбинировать статический текст с гибкими аргументами, например:

?- member(X, [friend,foe,love]),
<b>   format("hello my '~q'!\n", [X])</b>,
   false.

Уступая:

<b>hello my 'friend'!
hello my 'foe'!
hello my 'love'!</b>

Обратите внимание, что проблема одинарных кавычек даже не возникла в этом случае. Аналогичная проблема с " может быть снова решена с помощью \:

?- format("a \"test\"", []).
<b>a "test"</b>
...