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(...)
)この種のことは次のとおりです。 2番目(または、より高い)順序ロジック 一方、Prologは1次ロジックに基づいています。
ただし、少なくとも限られた程度まで、Prologにおける高次ロジック関数の実装がどのように可能であるかについての説明があります。そのような機能には実際の用途があります。見る プロログの芸術、第16章, 、 と Lee NaishによるPrologの高次ロジックプログラミング.
他のヒント
HM、私の経験から、それは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