因此,假设我在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.
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top