Prolog的= ..功能

时间:2010-11-24 12:14:19

标签: prolog

使用Prolog's = ..,是否可以从f(x),g(x)获得[f,x,g,x]之类的内容?我可以使用H =.. [f,x,g,x]获取f(x,g,x),但这不是我想要的。抱歉,如果这是一个愚蠢的问题,或者我正在使用= ..错误或某事。

任何人都知道有任何好网站解释使用= ..?

3 个答案:

答案 0 :(得分:4)

=../2(也称为univ / 2)能够从列表构造一个术语,其中列表的第一个元素将是新创建术语​​的函子,列表的其他元素将是它的论点。它不能一次创建多个术语。为此,它必须与您想要创建的术语数一样多次使用。

在您的情况下,您似乎需要三个术语:f(x)g(x)以及这两个术语之间的连接。在任何Prolog顶级实现的提示下发布的以下目标应该可以正常工作(这里我使用的是GNU Prolog,因为结果显示比SWI更清楚):

| ?- Fx =.. [f, x], Gx =.. [g, x], H =.. [',', Fx, Gx].

Fx = f(x)
Gx = g(x)
H = f(x),g(x)

当然,如果需要在多个位置重复使用,可以定义自己的谓词来封装此功能。

=../2的解释而言,我在课堂上和书本上学习了Prolog,所以当谈到在线资源时,我并不是那么知识渊博。但是,another StackOverflow question可能会对您有所帮助。

答案 1 :(得分:1)

= ..有时被称为univ运算符,据我所知,它的运行方式与你说的差不多,但只适用于一个仿函数。

 ?= f(x,y,z) =.. L

统一以便

L = [f,x,y,z]

评估为是。你似乎正在讨论相反的 - 左边的列表 - 这很好。但我仍然非常确定它只适用于函子和其余的原子或文字。我可能是错的,无论如何我都不是一个prolog专家。

http://wwwcgi.rdg.ac.uk:8081/cgi-bin/cgiwrap/wsi14/poplog/prolog/ploghelp/univ

答案 2 :(得分:0)

在列表的每个相关部分使用 univ 将产生两个术语:

?- Q=[f,x,g,x],[F,X,G,X]=Q,Fx=..[F,X],Gx=..[G,X].
Q = [f, x, g, x],
F = f,
X = x,
G = g,
Fx = f(x),
Gx = g(x).