البحث العكسي في Prolog؟ (كيف أجد كل ما هو صحيح في X؟)

StackOverflow https://stackoverflow.com/questions/3490985

  •  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.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top