在Prolog中看到用函子编写的数据并不罕见,例如
note("This is a note")
但是Prolog还可以将名称移到参数中来处理数据,例如
(note,"This is a note")
将数据名称从函子移动到参数中时,是否存在用于描述此过程的名称?
我有一些代码可以对数据进行原样转换,并希望在文档中包含一个标准名称来描述此更改(如果存在)。
编辑
当前执行此操作的特定原因是,我不必使用=../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))
编辑
下面是@repeat的评论,其理由是不通过将复合词note(A,B)
更改为逗号列表(A,B)
而不是常规列表{{1 }}。这是一个很好的建议,但有时有理由中断此类建议。我目前不能满足我当前的需要,是否在Prolog中这样做是其中一种情况,但是正如问题所问的那样,最好为该过程起个名字,以便可以对其进行研究。
@repeat您可以编辑它并添加注释,因为它们都是知识共享。
答案 0 :(得分:5)
实际上,(note, "this is a note")
是一个包含函子,
和Arity 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")
因此,您要执行以下操作:使用主函数,
将Arity项N的主仿函数“移动”到Arity N + 1项,并添加前一个functor名称作为第一个参数,然后转移另一个参数是某种概括,尽管我不知道是否有更合适的名称。
答案 1 :(得分:2)
您可能会认为这是将高阶逻辑片段的应用编码写入一阶逻辑的一种受限方式。应用编码使用常量来表示函数,并使用二进制函数符号app来表示f应用于参数列表。例如,f(g(a),b)
的适用编码为app(f, [app(g,[a]),b ])
。在您的情况下,,/N
运算符扮演着这个角色,但是您可能已经注意到,如果没有参数列表,则需要在与该术语匹配时知道参数数量。
在Prolog上下文中使用此编码的示例是高阶自动定理证明者输入格式TPTP THF。他们使用infix operator @
代表应用程序。在那里,他们还使用使用嵌套应用程序的标准编码。术语表示不是那么漂亮(示例术语写为(f @ (g @ a))) @ b
),但是它的优点是常量仅具有一种表示。使用列表编码时,您必须考虑到c = app(c, [])
。