Prolog 是否有用于将函子名称移动到参数中的序言名?

Prolog 是否有用于将函子名称移动到参数中的序言名?,prolog,terminology,Prolog,Terminology,在Prolog中看到用函子编写的数据并不少见,例如 note("This is a note") 但是Prolog也可以处理名称移动到参数的数据,例如 (note,"This is a note") 将数据名称从函子移动到参数中时,是否有名称用于描述此过程 我有一些代码,将数据转换为这样,并希望在文档中包含一个标准名称来描述此更改(如果存在) 编辑 目前这样做的具体原因是,我不必使用,也可以使用匿名变量对许多数据进行比较,例如 (_,A,B,C) 或者编写更一般的谓词,例如 do(_)

在Prolog中看到用函子编写的数据并不少见,例如

note("This is a note")
但是Prolog也可以处理名称移动到参数的数据,例如

(note,"This is a note")
将数据名称从函子移动到参数中时,是否有名称用于描述此过程

我有一些代码,将数据转换为这样,并希望在文档中包含一个标准名称来描述此更改(如果存在)

编辑

目前这样做的具体原因是,我不必使用,也可以使用匿名变量对许多数据进行比较,例如

(_,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的评论,其中说明了不做本问题中所述的事情的原因,即将复合术语noteA,B更改为逗号列表a,B,而不是常规列表[a,B]。这是一个很好的建议,但有时有理由打破这种建议。我目前还不能确定在Prolog中这样做是否属于此类情况,但正如问题所问,最好能为该过程命名,以便搜索研究

@重复一遍,您可以编辑此内容并添加注释,因为它都是知识共享

事实上,注意,这是一个注,是一个带有函子的项,算术2第一个参数是注,第二个参数是注

您可以通过以下查询看到这一点:

?- 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第一个参数是注记,第二个参数是注记

您可以通过以下查询看到这一点:

?- 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元数的主函子上,加上前面的函子名作为第一个参数,然后移动其他参数,这是一种推广,尽管我不知道是否有更合适的名称。

您可以将其视为将高阶逻辑片段的应用编码写入一阶逻辑的受限方式。应用程序编码使用常量表示函数,并使用二进制函数符号app表示f应用于参数列表。例如,fga,b的应用编码是appf,[appg,[a],b]。在您的例子中,/N运算符起着这个作用,但是您可能已经注意到,如果没有参数列表,那么在匹配此类术语时,您需要知道参数的数量


在Prolog上下文中使用这种编码的一个例子是高阶自动定理证明器输入格式。它们使用一个表来表示应用程序。在那里,他们还使用标准编码,使用嵌套的应用程序。术语表示法不如示例术语f@g@a@b漂亮,但其优点是常数只有一种表示法。使用列表编码时,您必须考虑c=appc,[]。

您可以将其视为将高阶逻辑片段的应用编码写入一阶逻辑的受限方式。应用程序编码使用常量表示函数,并使用二进制函数符号app表示f应用于参数列表。例如,fga,b的应用编码是appf,[appg,[a],b]。在您的例子中,/N运算符起着这个作用,但是您可能已经注意到,如果没有参数列表,那么在匹配此类术语时,您需要知道参数的数量


在Prolog上下文中使用这种编码的一个例子是高阶自动定理证明器输入格式。它们使用一个表来表示应用程序。在那里,他们还使用标准编码,使用嵌套的应用程序。术语表示法不如示例术语f@g@a@b漂亮,但其优点是常数只有一种表示法。使用列表编码时,您必须考虑到c=appc,[]。

没有回答问题,但仍然useful@GuyCoder例如我也不得不同意他的意见。在回答中添加了一条评论,指出对我来说,你所做的是某种概括,尽管它可能有一个更好的名字。有趣的是:Haskell没有回答这个问题,但仍然useful@GuyCoder例如我也不得不同意他的意见。在回答中添加了一条评论,指出对我来说,你正在做的是某种概括,尽管它可能有一个更好的名称。感兴趣的:Haskell of interest:-这不是这里正在做的。添加此参考是因为它与可能导致答案的单词头脑风暴相同。有趣的是:-不要与Prolog Funtto混淆
R头脑风暴的另一个词。有趣的:-宏的扩展保证不会导致意外捕获标识符。头脑风暴的另一个词。有趣的:-是一个范畴概念的概括。头脑风暴的另一个词。逗号列表,同样:每个逗号术语都有两个参数。如果项目数量相当少,则应使用一些结构f/N。恒定的访问时间,而不是线性的逗号列表:-这不是这里要做的。添加此参考是因为它与可能导致答案的单词头脑风暴相同。有趣的是:-不要与Prolog functor混淆。头脑风暴的另一个词。有趣的:-宏的扩展保证不会导致意外捕获标识符。头脑风暴的另一个词。有趣的:-是一个范畴概念的概括。头脑风暴的另一个词。逗号列表,同样:每个逗号术语都有两个参数。如果项目数量相当少,则应使用一些结构f/N。恒定的访问时间,而不是逗号列表信息的线性。因为我不确定这个过程是否有真名,所以我现在不能接受。我只是讨厌投赞成票,后来发现有一个明确的答案。在决定之前,我想让这件事搁置几周,甚至可能决定再等一段时间。另一方面,如果这个或另一个答案给出的答案引用了一本重要的序言书、ISO标准等,那么很可能会得到答案;现在读吧我读得越多,就越确信这是不对的。没有说这是错误的,只是目前不再考虑术语是否合适。这篇文章本身是关于一种高阶语言的,但他们的写作方式有明确的应用。我假设您做的更少,并且只编码最外层的应用程序:fga,b变成f,ga,b而不是f,g,a,b。当我用适当的括号写后一个时,我们得到了应用编码:f,g,a,b。现在用@替换,就这样。这是错误的。在这个问题中,名称注释不是像dif那样的谓词,而是复合术语中数据的名称。没有要调用的相应谓词注释。如果我了解Prolog在后台是如何工作的,那么在更改后,它将成为函数的名称,但是从语法角度来看,需要什么并不重要。很好的信息。因为我不确定这个过程是否有真名,所以我现在不能接受。我只是讨厌投赞成票,后来发现有一个明确的答案。在决定之前,我想让这件事搁置几周,甚至可能决定再等一段时间。另一方面,如果这个或另一个答案给出的答案引用了一本重要的序言书、ISO标准等,那么很可能会得到答案;现在读吧我读得越多,就越确信这是不对的。没有说这是错误的,只是目前不再考虑术语是否合适。这篇文章本身是关于一种高阶语言的,但他们的写作方式有明确的应用。我假设您做的更少,并且只编码最外层的应用程序:fga,b变成f,ga,b而不是f,g,a,b。当我用适当的括号写后一个时,我们得到了应用编码:f,g,a,b。现在用@替换,就这样。这是错误的。在这个问题中,名称注释不是像dif那样的谓词,而是复合术语中数据的名称。没有要调用的相应谓词注释。如果我理解Prolog在后台是如何工作的,那么,在更改之后,它将成为函数的名称,但是从语法角度来看,需要什么并不重要。