Есть ли имя Пролога для перемещения имени функтора в аргумент? - PullRequest
1 голос
/ 19 марта 2019

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

note("This is a note")

но Prolog также может обрабатывать данные с именем, перемещенным в аргумент, например,

(note,"This is a note")

При перемещении имени данных из функтора в аргумент, используется ли имя для описания этого процесса?

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


EDIT

В настоящее время конкретная причина для этого заключается в том, что мне не нужно использовать = .. / 2 , а также можно выполнить сравнение многих данных с анонимной переменной, например,

(_,A,B,C) 

или написать более общие предикаты, например,

do(_)
do(_,A)
do(_,A,B)

вместо

do(note(A))
do(note(A,B))
do(note(A,B,C))
do(comment(A))
do(comment(A,B))
do(comment(A,B,C))
do(text(A))
do(text(A,B))
do(text(A,B,C))

EDIT

Ниже приведен комментарий @repeat с причинами не делать то, что продемонстрировано в этом вопросе, путем изменения составного термина note(A,B) в список запятых (A,B), в отличие от обычного списка [A,B]. Это хороший совет, но иногда есть причины нарушить этот совет. В настоящее время я не могу сказать, что мне нужно для этого, если одним из таких случаев является выполнение этого в Прологе, но, как задается вопрос, было бы неплохо иметь имя для процесса, чтобы его можно было искать для исследования.


@ repeat Вы можете отредактировать это и добавить примечания, поскольку это все Creative Commons.


Ответы [ 2 ]

5 голосов
/ 19 марта 2019

На самом деле (note, "this is a note") - это термин с функтором , и арностью 2 (первый аргумент note и второй аргумент "this is a note").

Это можно увидеть, выполнив следующие запросы:

?- write_canonical(note("This is a note")).
note("This is a note")

?- write_canonical((note,"This is a note")).
','(note,"This is a note")

Итак, что вы делаете, «перемещая» главный функтор члена арности N к члену арности N + 1 с главной функцией , добавляя предыдущее имя функтора в качестве первого аргумента и сдвигая другие аргументы, какое-то обобщение, хотя я не знаю, есть ли более подходящее название для этого.

2 голосов
/ 20 марта 2019

Вы можете рассматривать это как ограниченный способ записи аппликативного кодирования логического фрагмента высшего порядка в логику первого порядка. Аппликативное кодирование использует константы для представления функций и использует приложение символа двоичной функции для выражения того, что f применяется к списку аргументов. Например, аппликативная кодировка f(g(a),b) равна app(f, [app(g,[a]),b ]). В вашем случае оператор ,/N играет эту роль, но, как вы, наверное, заметили, без списка аргументов вам нужно знать количество аргументов, когда вы сопоставляете такой термин.

Примером использования этой кодировки в контексте Пролога является формат ввода автоматического доказательства теорем высшего порядка TPTP THF . Они используют инфиксный оператор @ для представления приложения. Там они также используют стандартную кодировку, которая использует вложенные приложения. Термин представление не такой красивый (пример термина написан (f @ (g @ a))) @ b), но он имеет преимущество в том, что константы имеют только одно представление. При кодировании списка необходимо учитывать, что c = app(c, []).

...