prolog中的反向查找? (我如何找到有关X的真实的所有内容?)
-
28-09-2019 - |
题
因此,假设我在Prolog数据库中有以下内容:
person(john).
person(mary).
happy(john).
很明显,如果我想列出所有人,我可以输入:
person(X).
但是,如果我想找到约翰真实的所有东西怎么办?我不能做:
X(john).
但是我希望能够将“约翰”放入“人”和“快乐”。
显然,我可以存储我的信息:
is(person, john).
is(person, mary).
is(happy, john).
然后,我可以做:
is(X, john).
但是我在这里失去了一些表现力。我真的希望能够做类似的事情:
X(john).
有任何想法吗?
谢谢!
解决方案
对谓词进行参数化查询(如查找∀x
超过 x(...)
)通常不可能在序言中本地可能性,因为这种事情是 第二(或更高) - 阶逻辑 操作,而Prolog是基于一阶逻辑。
但是,有一些描述,说明如何在序言中实现高阶逻辑函数,至少在有限的程度上是可以实现这种功能的实际用途。看 Prolog的艺术,第16章, , 和 李·奈什(Lee Naish)在Prolog中的高阶逻辑编程.
其他提示
嗯,根据我的经验,这不是普罗洛文的典型用例。如果您想列举有关约翰的所有“事实”,则首先必须将它们定义为术语,并编码它们的敏锐度。那你可以使用 call/N
并沿着兔子洞沿另一个缺口(借助GNU Prolog的帮助):
relation(1,person).
relation(2,married).
person(john).
married(john,mary).
? relation(1,X), call(X,john).
X = person
| ?- relation(2,X),call(X,john,Y).
X = married
Y = mary
请注意使用 call
有许多有趣的问题和运行时错误的潜力。
这是一个近似:
all_predicates(Term) :-
current_predicate(_, Pred), %% match Pred to any currently defined predicate
\+ predicate_property(Pred, built_in), %% filter out the built-in predicates
functor(Pred, Name, 1), %% check that Pred has 1 argument and match Name to its name
Goal =.. [Name, Term], %% construct the goal Name(Term)
call(Goal). %% Note that if Pred has side effects, they will happen.
不隶属于 StackOverflow