刚刚做了一个有趣的观察。SWI-Prolog允许
atom以外的其他元素作为化合物中的函子。例如,它允许我做:
/* atom as functor */
?- Y =.. [foo, bar].
Y = foo(bar).
/* stream as functor */
?- current_input(X), Y =.. [X, bar].
X = <stream>(0000000069066420),
Y = <stream>(0000000069066420)(bar).
我想知道是否有一个可以作为函子的名称
I。E原子或流等等。SWI-Prolog的错误信息没有
告诉我名字是什么,它说它需要一个原子:
?- Y =.. [1, bar].
ERROR: Type error: `atom' expected, found `1' (an integer)
但可以看到一个流等。
不是原子。?- current_input(X), atom(X).
false.
SWI-Prolog接受的函子的保护伞类型是什么?
注:我猜为什么允许这样做:例如,它用于字典,
字典是带有特殊函子C'dict'的复合词。
编辑10.09.2021:
我一开始以为很简单。但是simple/1是为atom或var保留的
,根据这个答案:
谓词"simple/1"的意义是什么?
在SWI-Prolog中,blobs(阿尔该ob国民住宅s)用于存储任意二进制数据,包括原子、图像和流句柄。特别地,表示流句柄的blob是一个没有语法表示的唯一符号(尽管它被输出为<stream>(hex-number)
)。
内置谓词blob/2
可用于获取blob的类型:
?- X = foo, blob(X,Y).
X = foo,
Y = text.
?- current_input(X), blob(X,Y).
X = <stream>(0000000069057160),
Y = stream.
因此,我认为在SWI-Prolog中作为函子接受的类型是blob.
在Dogelog Runtime中,我们最近引入了一个名为symbol/1
的新类型测试器。可以想象它是从blob/2
引导的,如下所示:
symbol(X) :- blob(X, _).
Dogelog运行时也接受符号作为函子,类似于sw - prolog。这用于内联析取和if-then-else,并且可以有进一步的优化用例。函子不仅限于原子,还可以是原子或引用:
/* Dogelog Runtime, 0.9.6 */
?- current_input(X), atom(X).
fail.
?- current_input(X), Y =.. [X, bar].
X = [object Object], Y = [object Object](bar).
但我目前正在考虑扩展(=..)/2
甚至更多。即允许一个化合物作为函子。作为函子的化合物应该做什么?非常简单:
/* Expected Result */
?- X =.. [foo(bar), baz].
X = foo(bar, baz)
因此(=..)/2
会将参数添加到给定的化合物中。(=..)/2
的进一步扩展不需要在复合函子中添加新的数据类型,而是改变了它的行为。
它将有几个用例:
旧高阶:
引导应用/2将很容易:apply(X,L) :- G =.. [X|L], G.
新高阶:
对call/n进行Bottstrapping就像:call(X,Y) :- G =.. [X,Y], G. call(X,Y,Z) :- G =.. [X,Y,Z], G. call(X,Y,Z,T) :- G =.. [X,Y,Z,T], G. Etc..
常规心电图扩张:
用输入和输出列表展开非终结符只需要调用(=..)/2。下面是一个例子:?- G =.. [np(X),I,O]. G = np(X,I,O).