首页 > 解决方案 > PROLOG 内部结构

问题描述

问:我怎样才能抓住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

解决方案


目前尚不清楚您在问什么,但如果您在 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}).

推荐阅读