2010-06-28 13 views
10

क्या प्रोलॉग में स्थिरांक को परिभाषित करने का कोई तरीका है?प्रोलॉग कॉन्स्टेंट्स

मुझे लगता है मैं उपयोग कर रहा हूँ की तरह

list1 :- [1, 2, 3]. 
list2 :- [4, 5, 6]. 

predicate(L) :- append(list1, list2, L). 

काम के आसपास कुछ लिखने के लिए अब

list1([1, 2, 3]). 
list2([4, 5, 6]). 

predicate(L) :- 
    list1(L1), 
    list2(L2), 
    append(L1, L2, L). 

है चाहते हैं, लेकिन वह इस तरह का "बेकार" चर बाध्य करने के लिए एक सा अनाड़ी है हर बार मुझे निरंतर उपयोग करने की आवश्यकता होती है।

मुझे लगता है कि एक और (यहां तक ​​कि uglier) काम करता है, निर्माण श्रृंखला में सीपीपी शामिल करना होगा।

(अपने वास्तविक आवेदन में, सूची एक बड़ी कई स्थानों में इस्तेमाल किया LUT है।)

+3

एक काम के आसपास नहीं है यही कारण है कि। इसे तथ्य-घोषणा कहा जाता है। आप इस तथ्य को घोषित करते हैं कि 'सूची 1/1' लगातार लक्ष्य है यदि इसका तर्क '1,2,3]' है। प्रोलॉग में कोई चर नहीं है, इसलिए आप मान सकते हैं कि प्रत्येक "मान" (परमाणु या शब्द) निरंतर है और प्रत्येक "चर" (मान का नाम) निरंतर स्थिर नहीं है। प्रत्येक "परिवर्तनीय" (उदा। 'एल 1') भी '(1 + 2 * 3)' पकड़ सकता है और इसका कभी भी व्याख्या नहीं किया जाएगा, क्योंकि यह शब्द ('(1+ (2 * 3)) जैसा कुछ है और वहां है तथ्य '(7 है (1+ (2 * 3))। ')। जब आप' सूची 1 'को संलग्न करने के तर्क के रूप में पास करते हैं तो इसे परमाणु के रूप में व्याख्या किया जाता है। आप' myappend (list1, list2, [1,2,3] को परिभाषित कर सकते हैं , 4,5,6])। ' – ony

+0

मैं होने स्थिरांक नहीं करने के लिए एक काम के आसपास। – aioobe

उत्तर

11

मुझे नहीं लगता कि आपको लगता है कि 'शुद्ध' Prolog में (हालांकि कुछ कार्यान्वयन करने दे सकते हैं आप कुछ पास करने के लिए कर सकते हैं करते हैं , उदाहरण के लिए ECLiPSe अलमारियों है)।

कारण है:

1) आप नहीं बातें

list1 :- [4, 5, 6]. 

या

list1 = [4, 5, 6]. 

तरह क्योंकि दाहिने हाथ की ओर और बाएं हाथ की ओर दोनों आधार शब्द हैं लिख सकते हैं जो मेल नहीं खाता है।

2) आप नहीं है क्योंकि बाएं हाथ की ओर अब एक चर है, लेकिन चर केवल विधेय सिर/शरीर में अनुमति दी जाती है

List1 :- [4, 5, 6]. 

या

List1 = [4, 5, 6]. 

तरह बातें लिख सकते हैं ।

आप की तरह एक बहु विकल्प विधेय को परिभाषित क्या सकता है है:

myList([1, 2, 3]). 
myList([4, 5, 6]). 

और फिर bagof के साथ अपने सभी मूल्यों (या इसी तरह विधेय) को पुनः प्राप्त:

predicate(L) :- 
    bagof(ML, myList(ML), MLs),   
    concat(MLs, L). 

MLs है सभी ML मानों की सूची जो myList(ML) को संतुष्ट करती हैं और निश्चित रूप से concat सूचियों की एक सूची को जोड़ती हैं।

+0

मैं अपने जवाब के साथ सहमत के रूप में * उपयोग * तथ्य-घोषणा, और लगता है कि' पी की तरह जमीन शब्दों का उपयोग करके ([1,2, 3])। 'या 0-arity तरह' x.' आम तौर पर PROLOG में _global_ स्थिरांक परिभाषित करने के लिए, और जब विधेय की परिभाषा में स्थानीय ऐसी शर्तों, जो की तरह कुछ शामिल हो सकते हैं उपयोग करने के लिए जाने का रास्ता है शर्तों 'List1 = [ 4, 5, 6] 'एक subgoal के रूप में (के रूप में आप का उल्लेख)। – sharky

+0

वहाँ bagof ststement के अंत में एक अल्पविराम नहीं होना चाहिए? मैं एक एकल सूची। –

+0

@PulkitVerma में एमएलएस प्राप्त करने में सक्षम नहीं हूँ, सही लगता है, संपादित। – Mau

2

नहीं, आप प्रोलॉग में ऐसा नहीं कर सकते हैं, और भविष्यवाणी के माध्यम से इसे परिभाषित करना समझदार काम है।

या बेहतर, एक अनुमान में अपने लुकअप फ़ंक्शन को समाहित करें।

यह कहा गया है कि, यदि आप वास्तव में प्रीप्रोकैसिंग का उपयोग करना चाहते हैं तो term_expansion/2 है, लेकिन यदि आप सावधान नहीं हैं तो यह आपके कोड को अपठनीय और गन्दा बना सकता है।

तुम भी Prolog का एक्सटेंशन है कि समारोह संकेतन (Mercury तरह कार्यात्मक तर्क भाषाओं) में शामिल करने पर विचार कर सकता है। लेकिन ये प्रोलॉग से भी ज्यादा विदेशी हैं।

संबंधित मुद्दे