2013-12-14 3 views
0

Есть ли способ, с помощью которого portray_clause записывается в переменную вместо стандартного вывода?portray_clause to variable в Prolog

?- portray_clause(f(x):app(X, Y, Z)). 
    f(x):app(_, _, _). 
    true. 

?- portray_clause(Output, f(x):-app(X, Y, Z)). 
    ERROR: Arguments are not sufficiently instantiated 

Спасибо заранее

+0

Что нужно для достижения? Печать в другой поток (отличный от std out) или сохранение структуры, представляющей предложение? – rano

+0

Мне нужно сохранить структуру, которая представляет «симпатичный вывод» из файла portray_clause. Поэтому, если он печатает «f (x): app (_, _, _)». Мне нужно Ouput = f (x): app (_, _, _). –

+0

Пролог гомиконический, если вы можете передать свое предложение в предикат portray_clause, вы можете сохранить его где-то еще – rano

ответ

3

Если вы используете SWI-Prolog, вы можете использовать with_output_to/2. Чтобы написать, например, атом, вы говорите:

?- with_output_to(atom(A), portray_clause(foo(X) :- bar)). 
A = 'foo(_) :-\n\tbar.\n'. 
+0

Большое спасибо! –

+0

@MatthiasVanEeghem. Вы должны пометить свой вопрос [swi-prolog], так как это расширение SWI-Prolog. –

+0

Ах, ладно, сделаю :) –