【问题标题】:What does the colon (:) exactly stand for in Swi-Prolog?Swi-Prolog 中的冒号 (:) 究竟代表什么?
【发布时间】:2020-05-26 00:13:14
【问题描述】:

我无法明确找到 prolog 中的 (:) 代表什么。
在交互模式下,您可以看到以下证据:

?- display(a:b).
:(a,b)
true.

?- display([a,b,c]).
.(a,.(b,.(c,[])))
true.

?- display(a:b:c:[]).
:(a,:(b,:(c,[])))
true.

?- a:b:REST = a:TAIL.
TAIL = b:REST.

引入 (:) 的目的是什么? 我在 www 中找不到任何详细信息。 似乎它提供了另一种将递归结构称为列表的语法方式。

我们可以说它是Right-associative,它的优先级是多少?

:-op(??, xfy, :).

有没有办法列出所有此类隐式函子?

listing(op). %of course this does not work

【问题讨论】:

  • 代替display/1 更好地使用write_canonical/1 这是ISO。
  • 我认为正确的术语是“语法运算符”而不是“隐式函子”。 f 的中缀 op 声明允许用 f 代替 f(,).

标签: prolog colon


【解决方案1】:

这是module 限定符,你可以看到它的声明:

?- current_op(X,Y,:).
X = 600,
Y = xfy.

模块是 Prolog 的一个重要扩展,尤其是大型程序所需要的,但未符合 ISO 标准。 SWI-Prolog 对此(通常)有一个务实的观点,并实施了一种有用的方法。

OT 检查运营商,你会发现这个 sn-p 很有用:

oplist :-
    setof((A,C,B), current_op(A,B,C), L),
    maplist(writeln, L).

【讨论】:

  • ISO/IEC 13211-1(第 1 部分)不涵盖模块。然而 13211-2(第 2 部分)确实涵盖了模块——尽管这个标准非常薄弱——也就是说,它留下了很多定义的实现。许多人声称它留下了太多的东西,但随后他们不符合第 1 部分开始......
猜你喜欢
  • 2021-07-19
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多