【发布时间】:2010-11-24 12:14:19
【问题描述】:
使用 Prolog 的 =..,是否有可能从 [f,x,g,x] 得到诸如 f(x),g(x) 之类的东西?我可以使用H =.. [f,x,g,x] 来获取f(x,g,x),但这不是我想要的。抱歉,如果这是一个愚蠢的问题,或者我使用 =.. 不正确或其他什么。
任何人都知道任何解释 =.. 用法的好网站吗?
【问题讨论】:
标签: prolog
使用 Prolog 的 =..,是否有可能从 [f,x,g,x] 得到诸如 f(x),g(x) 之类的东西?我可以使用H =.. [f,x,g,x] 来获取f(x,g,x),但这不是我想要的。抱歉,如果这是一个愚蠢的问题,或者我使用 =.. 不正确或其他什么。
任何人都知道任何解释 =.. 用法的好网站吗?
【问题讨论】:
标签: prolog
=../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 可能对你有帮助。
【讨论】:
=.. 有时被称为 univ 运算符,据我所知,它的运行方式与您所说的差不多,但仅适用于 ONE 函子。
?= 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
【讨论】:
在列表的每个相关部分上使用 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).
【讨论】: