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



刚刚做了一个有趣的观察。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).
    

最新更新