使用Prolog's = ..,是否可以从f(x),g(x)
获得[f,x,g,x]
之类的内容?我可以使用H =.. [f,x,g,x]
获取f(x,g,x)
,但这不是我想要的。抱歉,如果这是一个愚蠢的问题,或者我正在使用= ..错误或某事。
任何人都知道有任何好网站解释使用= ..?
答案 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).