是否有 atom/1 或 stream/1 等的 Prolog 名称(SWI-Prolog)

Is there a Prolog name for atom/1 or stream/1 etc (SWI-Prolog)

刚刚做了一个有趣的观察。 SWI-Prolog 允许除
之外的其他内容 原子作为化合物中的函子。例如它允许我做:

/* 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).

我想知道是否有一个允许作为函子的名称,
即原子或流等.. SWI-Prolog 的错误消息没有
告诉我名字是什么,它说它需要一个原子:

?- Y =.. [1, bar].
ERROR: Type error: `atom' expected, found `1' (an integer)

但是可以看出,被接受的流等不是原子:

?- current_input(X), atom(X).
false.

SWI-Prolog 接受的函子的伞型是什么?
P.S。我猜为什么这是允许的:例如它用于 Dicts,
字典是具有特殊函子 C'dict' 的化合物。

编辑 2021 年 9 月 10 日:
我首先想到的是 simple/1。但是simple/1被保留
对于 atom 或 var,根据这个答案:
What is the meaning of predicate "simple/1" in Prolog (SWI-Prolog)

在 SWI-Prolog 中,blobsbinary large objects) 用于存储任意二进制数据,包括原子、图像和流句柄。特别地,表示流句柄的 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 Runtime 也接受符号作为函子,类似于 SWI-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 的进一步扩展不需要复合仿函数中的新数据类型,而是改变其行为。

它将有几个用例:

  • 旧的高阶:
    自举 apply/2 就像:

    apply(X,L) :- G =.. [X|L], G.
    
  • 新高阶:
    Bottstrapping call/n 就像:

    一样简单
    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..
    
  • DCG扩展:
    通过输入和输出列表扩展非终结符只是调用 (=..)/2 的问题。这是一个例子:

    ?- G =.. [np(X),I,O].
    G = np(X,I,O).