البحث العكسي في 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, ، و البرمجة المنطقية ذات الترتيب العالي في Prolog بواسطة Lee Naish.
نصائح أخرى
HM ، من تجربتي ، هذه ليست حالة الاستخدام النموذجية للمقدمة. إذا كنت ترغب في تعداد جميع "الحقائق" عن جون ، فسيتعين عليك أولاً تعريفها على أنها مصطلحات ، وترميز قوسها. ثم يمكنك استخدام 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.