【问题标题】:PROLOG InternalsPROLOG 内部结构
【发布时间】:2021-02-14 15:59:22
【问题描述】:

问:我怎样才能抓住PROLOG中的每一个词,然后把它写出来?

问:类似:prolog_term(X,Functor,Arg1,Arg2) 和 prolog_term(X,Functor,Arg1)(我只对 /1 和 /2 arities 感兴趣)。

我想我想知道如何搜索并获取 PROLOG 术语,而不必对所有内容进行 RTFM。

[我广泛使用 Lisp 和 C(和汇编程序)(+30 年),现在正深入研究 PROLOG 的深层次]。

例子:

(1) 读取 JSON 事实库,例如

{ fb: 
  [
      { relation: "line", subject: "line6", object: "don't care" },
      { relation: "x1", subject: "line6", object: "160" },
      { relation: "y1", subject: "line6", object: "240" },
      { relation: "x2", subject: "line6", object: "160" },
      { relation: "y2", subject: "line6", object: "360" }
  ]
}

(事实库由三元组组成(当对象是“不关心”时,可能是二元组))

(2) 转换为内部PROLOG格式,例如

 line(line6).
 x1(line6,160).
 y1(line6,240).
 x2(line6,160).
 y2(line6,360).

(3) 在事实库上运行一些 PROLOG 规则。

(4) 以 JSON 格式写出所有(或部分)结果事实,例如类似:

   write_out([line, x1, y1, x2, y2, bounding_box_left, bounding_box_top, bounding_box_right, bounding_box_bottom])

(在本例中,line/x1/y1/x2/y2 事实被读入,bounding_box_* 事实在步骤(3)中生成)。

[提供更多详细信息 - 我试图让问题保持简短]

【问题讨论】:

  • 这是一个有点懒惰的问题(如您所知)。如果你的 Prolog 有一个 JSON 库,那么这些事情就很简单了。我会试着写一个答案。

标签: prolog


【解决方案1】:

不清楚你在问什么,但如果你在 Prolog 数据库中有以下事实:

line(line6).
x1(line6,160).
y1(line6,240).
x2(line6,160).
y2(line6,360).

它们实际上是您的 Prolog 程序在其中工作的“宇宙事实”,因此您可以通过尝试证明它们来“抓住它们”:

?- x1(line6,X).
X = 160.

而且你可以通过使用集合谓词 bagof/3、setof/3 和 findall/3 来“抓住它们”:

?- findall(x1(L,X),x1(L,X),All).

All = [x1(line6,160)].

现在上面有 5 个不同的谓词名称,这是多余的,所以人们想要一个用更少来表达更多的事实:

% rectangle(Linename,X1,Y1,X2,Y2).

rectangle(rectanglename,line6,160,240,160,360). % needs a unique name

只有一个事实!

如果您在 SWI Prolog 中,您还可以部署“dicts”以获得极大的优势:

rectangle(rectanglename,r{x1:160,y1:240,x2:160,y2:360}).

【讨论】:

  • 我想浏览数据库。我的第一个想法是:我可以统一一个仿函数名称吗? match(X(A,B)). Clause/2 很接近,但它希望我指定 x1(例如)。我很懒惰。如果这不可能,我会尝试其他方法。
  • @paultarvydas 您无法统一 Prolog 中的函子名称。但是这些事实应该以某种方式构造,即只有几个不同的名称/参数。 OTOH,你可以使用clause/2来收集它们。
  • 谢谢。我目前正盯着 prolog_codewalk.pl - 这是一个死胡同吗?
  • @paultarvydas 除非你想进行程序分析......这一步太远了。先试试条款/2。
  • 整个对话都混乱不堪。
猜你喜欢
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 2013-03-19
相关资源
最近更新 更多