prolog - 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 数据库中有以下事实:
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}).
推荐阅读
- node.js - Mongodb:如何将对象定位到排序数组中的第一位
- terraform - Terraform:从地图中获取值的问题
- html - 具有最小约束和步进功能的 HTML 输入类型编号不起作用
- c# - 获取用户输入、成分和价格,并返回最便宜和最昂贵的
- php - 如何在窗口机器上运行 apache 服务器时运行 php 命令输入 STDIN 以接受输入
- javascript - 我可以在内联 js 中使用 defer 属性吗?
- spring-boot - CDATA问题有没有好的解决方案
- java - hibernate.org 捆绑“导入包”链接到 rt.jar 中的错误包 javax.transaction 而不是 jboss-transaction.jar
- curl - 来自海康威视门户站的流式视频 (DS-KV8102-IP)
- java - 我想在春季启动启动时在日志中打印项目版本和构建时间等构建信息