2016-09-02 2 views
3

Какой самый идиоматический подход для вывода прологового кода из прологовой программы (в качестве побочного эффекта)?Пролог: Генерация кода

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

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

Если вы чувствуете, что этот вопрос может быть лучше сформулирован каким-либо другим способом, отредактируйте его или оставьте комментарий.

+0

По крайней мере, дайте конкретный пример ввода текста и представление Prolog, которое вы хотите в качестве вывода. Неидиоматический подход, который делает это, также улучшит ваш вопрос. –

+0

Создать правила, утвердить их и использовать «листинг/1» или аналогичный: http://www.swi-prolog.org/pldoc/man?section=listing –

+1

Прошли ли вы?Я также заинтересован в создании автоматизированного кода в Prolog (Ergo/Flora предпочтительнее), но на основных языках (C++, ..) Делали ли вы некоторые попытки в области синтеза кода на сетях гиперграфов (opencog/hypergraphdb)? –

ответ

1

writeq/1 (или формат ('~ q', [...])) выводит результат, который можно прочитать. Обычно вам нужно также поставить полную остановку после тела предложения. Например, попробуйте

?- A_Clause = (X is 1+Y, write('X is '), write(X), nl), format('~q.~n', [A_Clause]). 

читаемость кода страдает от потери переменных «хорошие имена», но функциональность есть ...

редактировать

как отмечает @false, пространство до того, как точка будет избегать ошибки в случае, если срок окончания будет заканчиваться точкой

+0

Скорее небезопасно это '' ~ q. ~ N'' с условиями, которые clobber с '.' – false

+0

@false: спасибо, я исправлю ответ – CapelliC

+1

Самый безопасный выбор для написания кода Пролога, который можно прочитать, является стандартным' write_canonical/1-2' предикаты. –

3

самый идиоматический путь всегда равен s tay чистый и избегать побочные эффекты.

Позвольте toplevel сделать письмо для вас!

Чтобы генерировать программу на Прологе, вы определяете отношение, который говорит, например:

program(P) :- ... 

, а затем говорится, с точки зрения логических отношений, , что держит о   P.

Например:

 
program(P) :- 
     P = (Head :- Body), 
     Head = head(A, B), 
     Body = body(A, B). 

Пример запрос и ответ:

 
?- program(P). 
P = (head(_G261, _G262):-body(_G261, _G262)). 

Таким образом, есть ваша программа, произведенная в чистом виде.

Если вы хотите написать, используйте portray_clause/1:

 
?- program(P), portray_clause(P). 
head(A, B) :- 
     body(A, B). 
... 

Это может быть полезно в провале инициативы цикла, чтобы автоматически производить много программ.

Смежные вопросы