نصمم لغة برمجة متعددة النماذج. الجزء 3 - نظرة عامة على لغات تمثيل المعرفة

نواصل القصة حول إنشاء لغة برمجة متعددة النماذج تدعم أسلوبًا منطقيًا تعريفيًا لوصف نموذج المجال. المنشورات الماضية هي هنا و هنا . حان الوقت الآن لوصف الميزات والمتطلبات الرئيسية للغة وصف نموذج المجال. لكن أولاً ، لنقم بإلقاء نظرة عامة صغيرة على أكثر اللغات شيوعًا لتمثيل المعرفة. هذا مجال واسع إلى حد ما وله تاريخ طويل ويتضمن عددًا من المجالات - البرمجة المنطقية وحساب التفاضل والتكامل وتقنيات الويب الدلالية ولغات الإطار. أريد مقارنة لغات مثل Prolog و SQL و RDF و SPARQL و OWL و Flora ، وألقي الضوء على تلك الميزات التي قد تكون مفيدة في لغة البرمجة متعددة النماذج المصممة.



برولوج



لنبدأ بالبرمجة المنطقية ولغة برولوج. يتم تقديم المعرفة حول مجال الموضوع فيه كمجموعة من الحقائق والقواعد. الحقائق تصف المعرفة الفورية. ستبدو الحقائق المتعلقة بالعملاء (المعرف والاسم وعنوان البريد الإلكتروني) والفواتير (المعرف ، والعميل ، والتاريخ ، والمبلغ المستحق والمبلغ المدفوع) من المثال من المنشور السابق على هذا النحو



client(1, "John", "john@somewhere.net").
bill(1, 1,"2020-01", 100, 50).


تصف القواعد المعرفة المجردة التي يمكن اشتقاقها من القواعد والحقائق الأخرى. القاعدة تتكون من رأس وجسد. في رأس القاعدة ، تحتاج إلى تحديد اسمها وقائمة الوسائط. نص القاعدة هو قائمة المسندات المتصلة بعمليات منطقية AND (محددة بفاصلة) و OR (محددة بفاصلة منقوطة). يمكن أن تكون المسندات حقائق أو قواعد أو المسندات المضمنة ، مثل عمليات المقارنة والعمليات الحسابية وما إلى ذلك. يتم تحديد العلاقة بين وسيطات رأس القاعدة وحجج المسندات في جسمها باستخدام متغيرات منطقية - إذا كان نفس المتغير في مواضع وسيطتين مختلفتين ، هذا يعني أن هذه الحجج متطابقة. تعتبر القاعدة صحيحة عندما يكون التعبير المنطقي لجسم القاعدة صحيحًا. يمكن تعريف نموذج المجال على أنه مجموعة من القواعد المرجعية:



unpaidBill(BillId, ClientId, Date, AmoutToPay, AmountPaid) :- bill(BillId, ClientId, Date, AmoutToPay, AmountPaid), AmoutToPay < AmountPaid.
debtor(ClientId, Name, Email) :- client(ClientId, Name, Email), unpaidBill(BillId, ClientId, _, _, _).


لقد وضعنا قاعدتين. في الأول ، نؤكد أن جميع الفواتير التي تقل عن المبلغ المستحق هي فواتير غير مدفوعة. في الحالة الثانية ، المدين هو عميل لديه فاتورة واحدة على الأقل غير مدفوعة.



بناء جملة Prolog بسيط للغاية: العنصر الرئيسي للبرنامج هو القاعدة ، والعناصر الرئيسية للقاعدة هي المسندات والعمليات المنطقية والمتغيرات. في القاعدة ، يتركز الاهتمام على المتغيرات - فهي تلعب دور كائن من العالم النموذجي ، وتصف المسندات خصائصها والعلاقات بينها. في تعريف قاعدة المدين ، نذكر أنه إذا كانت عناصر ClientId والاسم والبريد الإلكتروني مرتبطة بعميل وعلاقة غير مدفوعة ، فستكون مرتبطة أيضًا بعلاقة المدين. يكون Prolog مفيدًا عندما تتم صياغة مشكلة كمجموعة من القواعد أو العبارات أو العبارات المنطقية. على سبيل المثال ، عند العمل بقواعد اللغة الطبيعية ، المترجمون ، في الأنظمة الخبيرة ، في تحليل الأنظمة المعقدة ، مثل أجهزة الكمبيوتر وشبكات الكمبيوتر وكائنات البنية التحتية. مركب،من الأفضل وصف أنظمة القواعد المعقدة بشكل صريح وتركها لوقت تشغيل Prolog للتعامل معها تلقائيًا.



يعتمد Prolog على منطق الدرجة الأولى (مع تضمين بعض عناصر منطق الترتيب الأعلى). يتم الاستدلال باستخدام إجراء يسمى تحليل SLD (دقة الفقرة المحددة الخطية الانتقائية). بشكل مبسط ، تعد خوارزميتها عبارة عن اجتياز شجرة لجميع الحلول الممكنة. يجد إجراء الاستدلال جميع الحلول للمسند الأول لهيئة القاعدة. إذا تم تمثيل المسند الحالي في قاعدة المعرفة بالحقائق فقط ، فإن الحلول هي تلك التي تتوافق مع الارتباطات الحالية للمتغيرات بالقيم. إذا كان ذلك وفقًا للقواعد ، فإن التحقق المتكرر من المسندات المتداخلة الخاصة بهم مطلوب. إذا لم يتم العثور على حلول ، يفشل فرع البحث الحالي. ثم يتم إنشاء فرع جديد لكل حل جزئي يتم العثور عليه. في كل فرع ، يربط إجراء الاستدلال القيم الموجودة بالمتغيرات ،مدرج في المسند الحالي ، ويبحث بشكل متكرر عن حل لقائمة المسندات المتبقية. ينتهي العمل عند الوصول إلى نهاية القائمة الأصلية. البحث عن حل يمكن أن يدخل حلقة لا نهاية لها في حالة التعريف العودي للقواعد. نتيجة إجراء البحث هي قائمة بجميع ارتباطات القيم الممكنة بالمتغيرات المنطقية.



في المثال أعلاه لقاعدة المدين ، ستعثر قاعدة الحل أولاً على حل واحد لمسند العميل وتربطه مع القيم المنطقية: ClientId = 1 ، Name = "John" ، Email = "john@somewhere.net". بعد ذلك ، بالنسبة لهذا المتغير من القيم المتغيرة ، سيتم تنفيذ حل للمبلغ الأصلي التالي غير المدفوع. للقيام بذلك ، تحتاج أولاً إلى إيجاد حلول للفاتورة الأصلية ، بشرط أن ClientId = 1. ستكون النتيجة ارتباطات للمتغيرات BillId = 1 ، Date = "2020-01" ، AmoutToPay = 100 ، AmountPaid = 50. في النهاية ، سيتم التحقق من AmoutToPay <AmountPaid في مسند المقارنة المدمج.



الشبكات الدلالية



الشبكات الدلالية هي واحدة من أكثر الطرق شيوعًا لتمثيل المعرفة. الويب الدلالي هو نموذج معلومات للمجال في شكل رسم بياني موجه. تتوافق رؤوس الرسم البياني مع مفاهيم المجال ، وتحدد الأقواس العلاقات بينها.



صورة



على سبيل المثال ، وفقًا للرسم البياني في الشكل أعلاه ، يرتبط مفهوم "الحوت" بعلاقة "هو" ("هو") بمفهوم "الثدييات" و "يعيش في" بمفهوم "الماء". وبالتالي ، يمكننا تحديد هيكل مجال الموضوع رسميًا - ما هي المفاهيم التي يتضمنها وكيف ترتبط ببعضها البعض. وبعد ذلك يمكن استخدام هذا الرسم البياني للعثور على إجابات للأسئلة واستخلاص معرفة جديدة منه. على سبيل المثال ، يمكننا استنتاج معرفة أن "الحوت" له "عمود فقري" إذا قررنا أن العلاقة "هي" تشير إلى علاقة فئة فرعية ، ويجب أن ترث الفئة الفرعية "حوت" جميع خصائص فئتها "الثدييات".



RDF



الويب الدلالي هو محاولة لبناء شبكة دلالية عالمية تعتمد على موارد شبكة الويب العالمية من خلال توحيد عرض المعلومات في شكل مناسب لمعالجة الآلة. لهذا الغرض ، يتم تضمين المعلومات بشكل إضافي في صفحات HTML في شكل سمات خاصة لعلامات HTML ، مما يسمح بوصف معنى محتواها في شكل أنطولوجيا - مجموعة من الحقائق والمفاهيم المجردة والعلاقات فيما بينها.



النهج القياسي لوصف النموذج الدلالي لموارد WEB هو RDF (إطار وصف الموارد أو إطار وصف الموارد). وفقًا لذلك ، يجب أن يكون لجميع البيانات شكل ثلاثي "الفاعل - المسند - الكائن". على سبيل المثال ، سيتم تقديم المعرفة حول مفهوم "الحوت" على النحو التالي: "الحوت" موضوع ، "يعيش في" - المسند ، "الماء" - كائن. يمكن وصف المجموعة الكاملة من هذه العبارات باستخدام رسم بياني موجه ، والموضوعات والأشياء هي رؤوسها ، والمسندات هي أقواس ، والأقواس المسند موجهة من الأشياء إلى الموضوعات. على سبيل المثال ، يمكن وصف الأنطولوجيا من مثال الحيوان على النحو التالي:



@prefix : <...some URL...>
@prefix rdf: <http://www.w3.org/1999/02/rdf-schema#>
@prefix rdfs: <http://www.w3.org/2000/01/22-rdf-syntax-ns#>
:Whale rdf:type :Mammal;
:livesIn :Water.
:Fish rdf:type :Animal;
:livesIn :Water.


يسمى هذا الترميز Turtle ويقصد به أن يكون مقروءًا من قبل الإنسان. ولكن يمكن كتابة نفس الشيء بتنسيقات XML أو JSON أو باستخدام علامات وسمات لمستند HTML. بينما في تدوين Turtle يمكن تجميع المسندات والأشياء معًا حسب الموضوع لسهولة القراءة ، على المستوى الدلالي ، كل ثلاثي مستقل.



RDF مفيد في الحالات التي يكون فيها نموذج البيانات معقدًا ويحتوي على عدد كبير من أنواع الكائنات والعلاقات فيما بينها. على سبيل المثال ، توفر ويكيبيديا الوصول إلى محتوى مقالاتها بتنسيق RDF. الحقائق الموصوفة في المقالات منظمة ، وصفت خصائصها وعلاقاتها ، بما في ذلك الحقائق من مقالات أخرى.



RDFS



نموذج RDF هو رسم بياني ؛ افتراضيًا ، لا يتم تضمين دلالات إضافية فيه. يمكن للجميع تفسير الروابط الموجودة في الرسم البياني بالشكل الذي يرونه مناسبًا. يمكنك إضافة بعض الارتباطات القياسية إليه باستخدام مخطط RDF - مجموعة من الفئات والخصائص لبناء الأنطولوجيات أعلى RDF. يسمح لك RDFS بوصف العلاقات القياسية بين المفاهيم ، مثل انتماء مورد إلى فئة معينة ، والتسلسل الهرمي بين الفئات ، والتسلسل الهرمي للخصائص ، وتقييد الأنواع المحتملة للموضوع والكائن.



على سبيل المثال ، البيان



:Mammal rdfs:subClassOf :Animal.


يحدد أن "الثدييات" هي فئة فرعية لمفهوم "الحيوان" وترث جميع خصائصها. وفقًا لذلك ، يمكن أيضًا أن يُعزى مفهوم "الحوت" إلى فئة "الحيوان". ولكن لهذا من الضروري الإشارة إلى أن مفهومي "الثدييات" و "الحيوان" عبارة عن فئات:



:Animal rdf:type rdfs:Class.
:Mammal rdf:type rdfs:Class.


أيضًا ، يمكن وضع قيود على المسند على القيم المحتملة لموضوعه وكائنه.



بيان



:livesIn rdfs:range :Environment.


يشير إلى أن كائن علاقة "يعيش في" يجب أن يكون دائمًا موردًا ينتمي إلى الفئة "البيئة". لذلك ، يجب أن نضيف بيانًا مفاده أن مفهوم "الماء" هو فئة فرعية لمفهوم "البيئة":



:Water rdf:type :Environment.
:Environment rdf:type rdfs:Class


يسمح لك RDFS بوصف مخطط البيانات - لتعداد الفئات والخصائص وتعيين التسلسل الهرمي والقيود على قيمها. و RDF هو ملء هذا المخطط بالحقائق الملموسة وتحديد العلاقة بينهما. الآن يمكننا طرح سؤال حول هذا الرسم البياني. يمكن القيام بذلك في لغة استعلام خاصة SPARQL ، والتي تشبه SQL:



SELECT ?creature
WHERE {
?creature rdf:type :Animal;
:livesIn :Water.
} 


سيعود لنا هذا الاستعلام قيمتين: "Whale" و "Fish".



يمكن تنفيذ مثال من المنشورات السابقة مع الحسابات والعملاء تقريبًا على النحو التالي. باستخدام RDF ، يمكنك وصف مخطط البيانات وتعبئته بالقيم:



:Client1 :name "John";
    :email "john@somewhere.net".
:Client2 :name "Mary";
    :email "mary@somewhere.net".
:Bill_1 :client :Client1;
    :date "2020-01";
    :amountToPay 100;
    :amountPaid 50.
:Bill_2 :client :Client2;
    :date "2020-01";
    :amountToPay 80;
    :amountPaid 80.


لكن المفاهيم المجردة مثل "المدين" و "الفواتير غير المسددة" من المقالة الأولى في هذه السلسلة تتضمن العمليات الحسابية والمقارنة. لا تتناسب مع البنية الثابتة للشبكة الدلالية للمفاهيم. يمكن التعبير عن هذه المفاهيم باستخدام استعلامات سباركل:



SELECT ?clientName ?clientEmail ?billDate ?amountToPay ?amountPaid 
WHERE {
?client :name ?clientName;
          :email ?clientEmail.
?bill :client ?client;
       :date ?billDate;
       :amountToPay ?amountToPay;
       :amountPaid ?amountPaid.
FILTER(?amountToPay > ?amountPaid).
}


عبارة WHERE هي قائمة بالأنماط الثلاثية وشروط التصفية. يمكن استبدال المتغيرات المنطقية في ثلاثة توائم ، ويبدأ اسمها بـ "؟" تتمثل مهمة منفذ الاستعلام في العثور على جميع القيم الممكنة للمتغيرات التي سيتم تضمين جميع الأنماط الثلاثية في الرسم البياني ويتم استيفاء شروط التصفية.



على عكس Prolog ، حيث يمكن استخدام القواعد لإنشاء قواعد أخرى ، في RDF لا يعد الاستعلام جزءًا من الويب الدلالي. لا يمكن الإشارة إلى طلب كمصدر بيانات لطلب آخر. صحيح أن سباركل لديها القدرة على تمثيل نتائج الاستعلام كرسم بياني. لذا يمكنك محاولة دمج نتائج الاستعلام مع الرسم البياني الأصلي وتشغيل الاستعلام الجديد على الرسم البياني المدمج. لكن من الواضح أن مثل هذا القرار سيتجاوز أيديولوجية قوات الدفاع الرواندية.



بومة



من المكونات المهمة لتقنيات الويب الدلالي OWL (لغة علم الوجود على الويب) ، وهي لغة لوصف الأنطولوجيا. باستخدام مفردات RDFS ، يمكنك فقط التعبير عن العلاقات الأساسية بين المفاهيم - التسلسل الهرمي للفئات والعلاقات. تقدم OWL مفردات أكثر ثراءً. على سبيل المثال ، يمكنك تحديد أن فئتين (أو كيانين) متكافئتان (أو مختلفتان). غالبًا ما يتم مواجهة مثل هذه المهمة عند الجمع بين علم الوجود.



يمكنك إنشاء فئات مركبة بناءً على التقاطع أو الاتحاد أو إضافة فئات أخرى:



  • عند التقاطع ، يجب أيضًا تطبيق جميع مثيلات الفئة المركبة على جميع فئات المصدر. على سبيل المثال ، يجب أن تكون "Marine Mammal" "Mammal" و "Sea Dweller" في نفس الوقت.
  • . , , «» «», «» «». «».
  • , . , «» «».
  • . , .
  • — , .


تسمى هذه التعبيرات التي تسمح لك بربط المفاهيم ببعضها بالمُنشئين.

يتيح لك OWL أيضًا تعيين العديد من خصائص العلاقة المهمة:



  • عبورية. إذا كانت العلاقات P (x ، y) و P (y ، z) مثبتة ، فإن العلاقة P (x ، z) تكون راضية أيضًا. أمثلة على هذه العلاقات هي "المزيد" - "أقل" ، "الأصل" - "الطفل" ، إلخ.
  • تناظر. إذا تم استيفاء العلاقة P (x ، y) ، فإن العلاقة P (y ، x) تتحقق أيضًا. على سبيل المثال ، علاقة نسبي.
  • الاعتماد الوظيفي. إذا استمرت العلاقات P (x، y) و P (x، z) ، فيجب أن تكون قيم y و z متطابقة. مثال على ذلك هو علاقة الأب - لا يمكن أن يكون للشخص أبان مختلفان.
  • انقلاب العلاقات. يمكنك تحديد أنه إذا تم استيفاء العلاقة P1 (x ، y) ، فيجب تحقيق علاقة أخرى P2 (y ، x). مثال على هذه العلاقة هو العلاقة بين الوالدين والطفل.
  • سلاسل العلاقات. يمكنك تحديد أنه إذا ارتبطت A ببعض الخصائص مع B ، و B - مع C ، فإن A (أو C) تنتمي إلى فئة معينة. على سبيل المثال ، إذا كان "أ" له أب لـ "ب" ، والأب "ب" لديه والده "ج" ، فإن "أ" هو حفيد "ج".


يمكنك أيضًا تعيين قيود على قيم وسيطات العلاقات. على سبيل المثال ، حدد أن الوسيطات يجب أن تنتمي دائمًا إلى فئة معينة ، أو أنه يجب أن يكون للفئة علاقة واحدة على الأقل من نوع معين ، أو تحدد عدد العلاقات من هذا النوع لها. أو يمكنك تحديد أن جميع المثيلات المرتبطة بعلاقة معينة بقيمة معينة تنتمي إلى فئة معينة.



OWL هي الآن الأداة القياسية الواقعية لبناء الأنطولوجيا. هذه اللغة مناسبة بشكل أفضل لبناء أنطولوجيات كبيرة ومعقدة من RDFS. يسمح لك بناء جملة OWL بالتعبير عن المزيد من الخصائص المختلفة للمفاهيم والعلاقات فيما بينها. ولكنه يقدم أيضًا عددًا من القيود الإضافية ، على سبيل المثال ، لا يمكن الإعلان عن نفس المفهوم في وقت واحد كفئة وكمثال لفئة أخرى. تعد أنطولوجيا OWL أكثر صرامة وموحدة وبالتالي أكثر قابلية للقراءة. إذا كان RDFS عبارة عن عدد قليل من الفئات الإضافية أعلى الرسم البياني لـ RDF ، فإن OWL له أساس رياضي مختلف - منطق الوصف. وفقًا لذلك ، تتوفر إجراءات الاستدلال الرسمية التي تتيح لك استخراج معلومات جديدة من أصول OWL والتحقق من اتساقها والإجابة على الأسئلة.



المنطق الوصفي هو جزء من منطق الدرجة الأولى. يُسمح فقط بالمسندات أحادية المكان (على سبيل المثال ، المفهوم ينتمي إلى فئة) ، المسندات ذات المكانين (للمفهوم خاصية وقيمتها) ، بالإضافة إلى منشئي الفئة وخصائص العلاقة المذكورة أعلاه ، مسموح بها. تم إسقاط جميع التعبيرات الأخرى لمنطق الدرجة الأولى في المنطق الوصفي. على سبيل المثال ، فإن العبارات التي تشير إلى أن مفهوم "الفاتورة غير المدفوعة" ينتمي إلى فئة "الفاتورة" ، وأن مفهوم "الفاتورة" له خصائص "المبلغ الواجب دفعه" و "المبلغ المدفوع" ستكون مقبولة. ولكن لجعل العبارة التي مفادها أن مفهوم "الفاتورة غير المدفوعة" الخاصية "المبلغ الواجب دفعه" يجب أن يكون أكبر من الخاصية "المبلغ المدفوع" لن يعمل. يتطلب هذا قاعدة تتضمن مسندًا لمقارنة هذه الخصائص. للأسف،لا يسمح لك صانعو OWL بالقيام بذلك.

وبالتالي ، فإن تعبير المنطق الوصفي أقل من منطق الدرجة الأولى. لكن من ناحية أخرى ، فإن خوارزميات الاستدلال في المنطق الوصفي أسرع بكثير. بالإضافة إلى ذلك ، فهي تمتلك خاصية القدرة على اتخاذ القرار - يمكن العثور على الحل مضمونًا في وقت محدود. من المعتقد أن مثل هذه المفردات من الناحية العملية كافية تمامًا لبناء الأنطولوجيا المعقدة والضخمة ، وأن OWL هي حل وسط جيد بين التعبير وكفاءة الاستدلال.



وتجدر الإشارة أيضًا إلى SWRL (لغة قواعد الويب الدلالية) ، والتي تجمع بين القدرة على إنشاء فئات وخصائص في OWL مع قواعد الكتابة في إصدار محدود من لغة Datalog. أسلوب هذه القواعد هو نفسه كما في Prolog. يدعم SWRL المسندات المضمنة للمقارنة والرياضيات والسلسلة والتاريخ ومعالجة القائمة. هذا بالضبط ما افتقدناه من أجل تطبيق مفهوم "الفاتورة غير المدفوعة" بمساعدة تعبير واحد بسيط.



فلورا 2



كبديل للشبكات الدلالية ، ضع في اعتبارك تقنية مثل الإطارات. الإطار عبارة عن هيكل يصف كائنًا معقدًا ، وصورة مجردة ، ونموذجًا لشيء ما. يتكون من اسم ومجموعة من الخصائص (الخصائص) وقيمها. يمكن أن تكون قيمة الخاصية إطارًا آخر. أيضا ، يمكن أن يكون للخاصية قيمة افتراضية. يمكن إرفاق دالة لحساب قيمتها بالخاصية. يمكن أن يشتمل الإطار أيضًا على إجراءات الخدمة ، بما في ذلك معالجات مثل هذه الأحداث ، مثل إنشاء إطار وحذفه وتغيير قيمة الخصائص وما إلى ذلك. ومن الخصائص المهمة للإطارات القدرة على التوريث. يتضمن الإطار الفرعي جميع خصائص الإطارات الأصلية.



يشكل نظام الإطارات المرتبطة شبكة دلالية مشابهة جدًا للرسم البياني RDF. ولكن في مهام إنشاء علم الوجود ، حلت OWL محل الإطارات ، والتي أصبحت الآن المعيار الفعلي. OWL أكثر تعبيرا ، ولها أساس نظري أكثر تقدما - منطق وصفي رسمي. على عكس RDF و OWL ، حيث يتم وصف خصائص المفاهيم بشكل مستقل عن بعضها البعض ، في نموذج الإطار ، يعتبر المفهوم وخصائصه ككل واحد - الإطار. إذا كانت رؤوس الرسم البياني في نماذج RDF و OWL تحتوي على أسماء المفاهيم ، وتحتوي الحواف على خصائصها ، ثم في نموذج الإطار ، تحتوي رؤوس الرسم البياني على مفاهيم بكل خصائصها ، وتحتوي الحواف على اتصالات بين خصائصها أو علاقات الوراثة بين المفاهيم.



في هذا ، يكون نموذج الإطار قريبًا جدًا من نموذج البرمجة الشيئية. إنها متشابهة إلى حد كبير ، لكن لها نطاقًا مختلفًا - تهدف الإطارات إلى نمذجة شبكة من المفاهيم والعلاقات بينها ، و OOP - في نمذجة سلوك الكائنات وتفاعلها مع بعضها البعض. لذلك ، يوفر OOP آليات إضافية لإخفاء تفاصيل تنفيذ أحد المكونات عن المكونات الأخرى ، وتقييد الوصول إلى أساليب ومجالات الفصل.



تجمع لغات التأطير الحديثة (مثل KL-ONE و PowerLoom و Flora-2) بين أنواع البيانات المركبة لنموذج الكائن مع منطق الترتيب الأول. في هذه اللغات ، لا يمكنك وصف بنية الكائنات فحسب ، بل يمكنك أيضًا العمل مع هذه الكائنات في قواعد ، وإنشاء قواعد تصف شروط انتماء الكائن إلى فئة معينة ، وما إلى ذلك. تتلقى آليات الوراثة وتكوين الفئات تفسيرًا منطقيًا ، يصبح متاحًا للاستخدام من خلال إجراءات الاستدلال. هذه اللغات أكثر تعبيرًا من OWL ، فهي لا تقتصر على المسندات ذات المكانين.



على سبيل المثال ، دعنا نحاول تطبيق مثالنا مع المدينين بلغة Flora-2... تشتمل هذه اللغة على 3 مكونات: منطق الإطار المنطقي F ، الذي يجمع الإطارات ومنطق الترتيب الأول ، ومنطق الترتيب الأعلى HiLog ، والذي يوفر أدوات لتكوين عبارات حول بنية العبارات الأخرى والبرمجة الوصفية ، ومنطق تغيير منطق المعاملات ، والذي يسمح بالشكل المنطقي وصف التغيرات في البيانات والآثار الجانبية للحسابات. الآن نحن مهتمون فقط بمنطق إطار F-logic . بادئ ذي بدء ، سنستخدمه للإعلان عن هيكل الإطارات التي تصف مفاهيم (فئات) العملاء والمدينين:



client[|name => \string,
email => \string
|].
bill[|client => client,
date => \string,
amountToPay => \number,
amountPaid => \number,
amountPaid -> 0
|].


الآن يمكننا الإعلان عن حالات (كائنات) من هذه المفاهيم:



client1 : client[name -> 'John', email -> 'john@somewhere.net'].
client2 : client[name -> 'Mary', email -> 'mary@somewhere.net'].
bill1 : bill[client -> client1,
date -> '2020-01',
amountToPay -> 100
].
bill2 : bill[client -> client2,
date -> '2020-01',
amountToPay -> 80,
amountPaid -> 80
].


يشير الرمز "->" إلى اقتران سمة بقيمة محددة في كائن وقيمة افتراضية في إعلان فئة. في مثالنا ، يحتوي حقل المبلغ المدفوع لفئة الفاتورة على القيمة الافتراضية صفر. يعني الرمز ":" إنشاء كيان من الفئة: client1 و client2 هما كيانان من فئة العميل.



الآن يمكننا أن نعلن أن مفهومي "الفاتورة غير المدفوعة" و "المدين" هما فئتان فرعيتان من مفهومي "الحساب" و "العميل":



unpaidBill :: bill.
debtor :: client.


يعلن الرمز "::" عن علاقة وراثة بين الطبقات. يتم توريث بنية الفئة والأساليب والقيم الافتراضية لجميع حقولها. يبقى إعلان القواعد التي تحدد الانتماء إلى فئتي الفاتورة والمدين غير المسددة:



?x : unpaidBill :- ?x : bill[amountToPay -> ?a, amountPaid -> ?b], ?a > ?b.
?x : debtor :- ?x : client, ?_ : unpaidBill[client -> ?x]. 


ينص البيان الأول على أن المتغير ?هو كيان غير مدفوع الفواتير إذا كان كيان فاتورة وحقل المبلغ المدفوع أكبر من المبلغ المدفوع. في الثانية ، ما ?ينتمي إلى فئة unpaidBill ، إذا كانت تنتمي إلى فئة العميل وكان هناك كيان واحد على الأقل من فئة unpaidBill حيث تكون قيمة حقل العميل مساوية لمتغير ?. سيتم ربط هذا الكيان من فئة unpaidBill بمتغير مجهول ?_، ولن يتم استخدام قيمته بشكل أكبر.



يمكنك الحصول على قائمة المدينين باستخدام الاستعلام:



?- ?x:debtor.


نطلب منك العثور على جميع القيم المتعلقة بفئة المدين. ستكون النتيجة قائمة بجميع القيم الممكنة للمتغير ?x:



?x = client1


يجمع منطق الإطار بين رؤية النموذج الموجه للكائنات وقوة البرمجة المنطقية. سيكون مناسبًا عند العمل مع قواعد البيانات ، ونمذجة الأنظمة المعقدة ، ودمج البيانات المتباينة - في تلك الحالات التي تحتاج فيها إلى التركيز على بنية المفاهيم.



SQL



أخيرًا ، دعنا نلقي نظرة على الميزات الرئيسية لبناء جملة SQL. في المنشور الأخير ، قلنا أن SQL لها أساس نظري منطقي - حساب التفاضل والتكامل ، ونظر في تنفيذ مثال مع المدينين في LINQ. من حيث الدلالات ، فإن SQL قريبة من تأطير اللغات ونماذج OOP - في نموذج البيانات العلائقية ، يكون العنصر الرئيسي هو الجدول ، الذي يُنظر إليه ككل ، وليس كمجموعة من الخصائص المنفصلة.



يتناسب بناء جملة SQL تمامًا مع اتجاه الجدول هذا. الطلب مقسم إلى أقسام. تم نقل كيانات النموذج ، والتي يتم تمثيلها بالجداول وطرق العرض والاستعلامات المتداخلة ، إلى قسم FROM. يتم تحديد العلاقات بينهما باستخدام عمليات JOIN. التبعيات بين الحقول والشروط الأخرى موجودة في جمل WHERE و HAVING. بدلاً من المتغيرات المنطقية التي تربط الوسيطات الأصلية ، فإننا نعمل على حقول الجدول مباشرةً في الاستعلام. يصف بناء الجملة هذا بنية نموذج المجال بشكل أكثر وضوحًا من بناء جملة Prolog "الخطي".



كيف أرى أسلوب بناء الجملة للغة النمذجة



باستخدام مثال الفاتورة غير المدفوعة ، يمكننا مقارنة الأساليب مثل البرمجة المنطقية (Prolog) ، ومنطق الإطار (Flora-2) ، وتقنيات الويب الدلالية (RDFS ، و OWL ، و SWRL) ، وحساب التفاضل والتكامل (SQL). لخصت خصائصها الرئيسية في جدول:



لغة أساس رياضي اتجاه النمط نطاق التطبيق
برولوج منطق الترتيب الأول على القواعد الأنظمة المستندة إلى القواعد ، مطابقة الأنماط.
RDFS رسم بياني حول العلاقة بين المفاهيم مخطط بيانات موارد الويب
بومة المنطق الوصفي حول العلاقة بين المفاهيم علم الوجود
SWRL نسخة مجردة من منطق الدرجة الأولى لـ Datalog على القواعد أعلى الروابط بين المفاهيم علم الوجود
فلورا 2 الإطارات + منطق الدرجة الأولى على القواعد الموجودة أعلى هيكل الكائن قواعد البيانات ، نمذجة الأنظمة المعقدة ، دمج البيانات المتباينة
SQL حساب العلاقة على هياكل الطاولة قاعدة البيانات


نحتاج الآن إلى إيجاد أساس رياضي وأسلوب بناء جملة للغة نمذجة مصممة للعمل مع البيانات شبه المهيكلة وتكامل البيانات من مصادر مختلفة ، والتي سيتم دمجها مع لغات البرمجة الموجهة للكائنات والوظيفية ذات الأغراض العامة.



أكثر اللغات تعبيرًا هي Prolog و Flora-2 - فهي تستند إلى منطق كامل من الدرجة الأولى مع عناصر من منطق الترتيب الأعلى. بقية الأساليب هي مجموعات فرعية منه. باستثناء RDFS - لا علاقة له بالمنطق الرسمي على الإطلاق. في هذه المرحلة ، يبدو لي منطق الدرجة الأولى الكامل هو الخيار المفضل. بادئ ذي بدء ، أخطط للتركيز على ذلك. لكن الخيار المحدود في شكل حساب التفاضل والتكامل أو منطق قاعدة البيانات الاستنتاجية له مزايا أيضًا. يوفر أداءً رائعًا عند العمل بكميات كبيرة من البيانات. يجب النظر فيه بشكل منفصل في المستقبل. يبدو المنطق الوصفي محدودًا للغاية وغير قادر على التعبير عن العلاقات الديناميكية بين المفاهيم.



من وجهة نظري ، للعمل مع البيانات شبه المهيكلة ودمج مصادر البيانات المتباينة ، يكون منطق الإطار أكثر ملاءمة من Prolog أو OWL الموجهة نحو القواعد ، والموجهة إلى الروابط وفئات المفاهيم. يصف نموذج الإطار بوضوح هياكل الأشياء ويركز الانتباه عليها. في حالة الكائنات ذات الخصائص المتعددة ، يكون شكل الإطار أكثر قابلية للقراءة من القواعد أو ثلاثة توائم موضوع-خاصية-كائن. الوراثة هي أيضًا آلية مفيدة جدًا يمكنها تقليل كمية الشفرة المتكررة بشكل كبير. مقارنة بالنموذج العلائقي ، يتيح لك منطق الإطار وصف هياكل البيانات المعقدة مثل الأشجار والرسوم البيانية بطريقة أكثر طبيعية. والأهم من ذلك ،سيسمح القرب من نموذج الإطار لوصف المعرفة بنموذج OOP بدمجها في لغة واحدة بطريقة طبيعية.



أريد استعارة بنية استعلام من SQL. يمكن أن يكون لتعريف المفهوم شكل معقد ولا يضر تقسيمه إلى أقسام للتأكيد على الأجزاء المكونة له وتسهيل الإدراك. أيضًا ، بالنسبة لمعظم المطورين ، فإن بناء جملة SQL مألوف جدًا.



لذا ، أريد أن آخذ منطق الإطار كأساس للغة النمذجة. ولكن نظرًا لأن الهدف هو وصف هياكل البيانات ودمج مصادر البيانات المتباينة ، سأحاول التخلي عن بناء الجملة الموجه نحو القواعد واستبداله بنسخة منظمة مستعارة من SQL. سيكون العنصر الرئيسي لنموذج المجال "مفهوم" (مفهوم). في تعريفه ، أريد أن أدرج جميع المعلومات اللازمة لاستخراج كياناته من بيانات المصدر:



  • اسم المفهوم
  • مجموعة من صفاته.
  • () , ;
  • , ;
  • , .


سيشبه تعريف المفهوم استعلام SQL. وسيكون نموذج المجال بأكمله في شكل مفاهيم مترابطة.



أخطط لعرض الصيغة الناتجة من لغة النمذجة في المنشور التالي. بالنسبة لأولئك الذين يرغبون في التعرف عليه الآن ، يوجد نص كامل بأسلوب علمي باللغة الإنجليزية ، متاح هنا:



البرمجة الهجينة الموجهة لمعالجة البيانات شبه المنظمة



روابط إلى المنشورات السابقة:



تصميم لغة برمجة متعددة النماذج. الجزء 1 - ما الغرض منه؟

نصمم لغة برمجة متعددة النماذج. الجزء 2 - مقارنة بين نماذج البناء في PL / SQL و LINQ و GraphQL



All Articles