我想查询一个深层次的复合词
断言
a(b(c(d))).
I try to query
?- a(B(c(d))).
这里B是一个变量。它会产生误差。查询这种结构的方法是什么?
肯定有一种方法可以做到,但这是不必要的困难。
Prolog数据库中的内容是事实/规则。每个事实和规则(称为谓词指示符)的Name/Arity
是数据的结构。参数是内容。
在继续之前,考虑一些规范化数据表示的方法。这将使查询数据更容易。
不写:
a(b(c(d))).
你可以写:
inside(a, b).
inside(b, c).
inside(c, d).
这是表示嵌套结构的一种方式。要查询它,可以这样写:
inside(a, X), inside(X, c), inside(c, d)
关系数据库中用于表示平面表中嵌套的递归结构的所有技巧也适用于Prolog。
您必须使用=../2
aka。"univ"在两步过程中:
extract(a(Term),FunctorName) :-
Term =.. [FunctorName|_FunctorArgs].
所以:
?- extract(a(b(c(d))),X).
X = b.
在SWI-Prolog中,有几个非标准的谓词来覆盖arity-0复合术语和字典的额外情况。看一下这张便条
感谢您的宝贵回答。我似乎在试图以一种不应该使用的方式使用prolog。
例如,我想描述数据的结构。客户数据已创建时间属性。
storedobject(customer).
has(customer,
field(createdtime(
type (datetime (max('01013000'), min('01011000'))))
)
).
如果我使它平坦和全局createdtime断言,这将导致混乱,因为其他存储对象/表也有不同的最大最小createdtime。createdtime可以在不同的上下文中以不同的形式使用。所以我希望上面的结构能帮助我指定我谈论的是哪个createdtime,即客户对象上的字段。
在上面的表单中,我希望像这样查询以获得所有datetime字段。
?- has( TableName, field ( FieldName ( datetime (max(Max),min(Min))