4

したがって、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).

何か案は?

ありがとう!

4

3 に答える 3

2

PROLOG は 1 次ロジックに基づいているのに対し、このようなことは2 次 (またはそれ以上) のロジックx操作であるため、述語を介してクエリをパラメータ化すること ( ∀を検索するx(...)場合など) は通常、PROLOG でネイティブに行うことはできません。

ただし、PROLOG での高次論理関数の実装が、少なくとも限られた範囲でどのように可能であるかについての説明があります。そのような機能には実際の用途があります。The Art Of Prolog の第 16 章、およびLee Naish による Prolog の Higher-order logic programming を参照してください。

于 2010-08-20T03:05:56.740 に答える
1

うーん、私の経験からすると、これは 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

callusingには多くの興味深い問題があり、実行時エラーが発生する可能性があることに注意してください。

于 2010-08-16T16:22:31.743 に答える
0

これは概算です。

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.
于 2010-08-16T21:14:16.303 に答える