2010-11-16 14 views
7

यदि मैं यह कार्य हो:प्रोलॉग में अगर आप नेस्टेड अगर कोई और कथन कैसे करते हैं?

min(List1, List2, Output) :- 
    length(List1, N), 
    length(List2, M), 
    ( N < M -> 
     Output = 'true' 
    ; Output = 'false' 
    ). 

लेकिन क्या हुआ अगर मैं भी अगर एन == एम जाँच करने के लिए चाहते थे? शायद इस तरह:

min(List1, List2, Output) :- 
    length(List1, N), 
    length(List2, M), 
    ( N < M -> 
     Output = 'true' 
    ; ( N = M -> 
      Output = 'equal' 
     ; Output = 'other' 
     ) 
    ). 

काम नहीं लग रहा है।

+0

क्या, वास्तव में काम नहीं कर रहा है? क्या आपको ऐसे उत्तर मिल रहे हैं जिनकी आप उम्मीद नहीं करते हैं, या यह संकलित नहीं करते हैं? – sharky

उत्तर

5

निहितार्थ का आपका घोंसला (->) यहां सही दिखता है। ध्यान दें कि, आपकी परिभाषा में, N और M पूर्णांक होंगे (length/2 दोनों कॉल सफल मानते हैं), इसलिए एकीकरण के बजाय == के साथ तुलना की जा सकती है (=)। वास्तव में, आप भी, =:= इस्तेमाल कर सकते हैं गणित, SWI-PROLOG में बराबर होती है अर्थात्:

min(List1, List2, Output) :- 
    length(List1, N), 
    length(List2, M), 
    (N < M -> 
     Output = 'true' 
    ; (N =:= M -> 
      Output = 'equal' 
     ; Output = 'other' 
     ) 
    ). 

परीक्षण:

1 ?- min([a],[b],O). 
O = equal. 

2 ?- min([a,c],[b],O). 
O = other. 

3 ?- min([a,c],[b,d],O). 
O = equal. 

4 ?- min([a,c],[b,d,e],O). 
O = true. 
4

नेस्टेड में अगर-तो-और कुछ है, यह अनावश्यक कोष्ठकों को छोड़ देना आम बात है, उपज:

min(List1, List2, Output) :- 
    length(List1, N), 
    length(List2, M), 
    ( N < M -> Output = true 
    ; N =:= M -> Output = equal 
    ; Output = other 
    ). 

Prolog में, यह, मिलान पैटर्न जब संभव उपयोग करने के लिए अच्छा अभ्यास है क्योंकि यह अधिक सामान्य पैदावार अधिक decla अगर-फिर-और उपयोग करने से अधिक rative और अधिक पठनीय कार्यक्रम। शर्तों के इस विशेष मामले के लिए, compare/3 लाइब्रेरी भविष्यवाणी देखें। compare/3 आप एक परमाणु में दो लंबाई के संबंध वस्तु के बारे में जैसे सोचना है, और आप पैटर्न मिलान के साथ तीन शर्तों का वर्णन करने के कि परमाणु के उपयोग कर सकते हैं कर सकते हैं:

lists_output(List1, List2, Output) :- 
     length(List1, L1), 
     length(List2, L2), 
     compare(Order, L1, L2), 
     order_output(Order, Output). 

order_output(<, true). 
order_output(=, equal). 
order_output(>, other). 

नमूना क्वेरी और परिणाम:

?- lists_output([_,_], [_,_,_], Output). 
Output = true. 

?- lists_output([_,_,_], [_,_,_], Output). 
Output = equal. 

?- lists_output([_,_,_,_], [_,_,_], Output). 
Output = other. 
+0

काफी अच्छा, मुझे यह शैली पसंद है, यह साफ है। मुझे आश्चर्य है कि क्या ऑपरेटर प्राथमिकता नियम '-> ','; ', आदि के लिए नियम अन्य पोलॉग कार्यान्वयन के बीच आम हैं जैसे कि यह एसडब्ल्यूआई-पोलॉग विशिष्ट नहीं है (शायद मामला)? – sharky

+0

@ शार्की, मेरे पास एक आईएसओ मानक तैयार नहीं है, लेकिन मैंने पहले इस शैली को देखा है और @ मैट का कोड एसआईसीस्टस 3.12 में पूरी तरह से काम करता है। –

+2

@ लार्समैन: उदाहरण केवल आईएसओ के पूर्वनिर्धारित ऑपरेटरों का उपयोग करता है। 30 अमरीकी डालर के लिए मानक कैसे प्राप्त करें के लिए [टैग: आईएसओ-प्रोलॉग] देखें! – false

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