2010-07-28 9 views
5

मैंने नियम या ऑपरेटर को परिभाषित किया है लेकिन यह कई सत्य या गलत लौटाता है।प्रोलॉग या (;) नियम रिटर्न एकाधिक परिणाम

isloanaccept(Name,Guarantor,LoanType,LoanAmount,LoanTenure) 
:- customer(Name,bank(_),customertype(_), 
citizen(Ci),age(Age),credit(C), 
income(I),property(_),bankemployee(_)), 
Ci == 'malaysian', 
Age >= 18, 
C > 500, 
    I > (LoanAmount/LoanTenure)/12, 
isguarantor(Guarantor,Name), 
ispersonalloan(LoanType,LoanAmount,LoanTenure); 
ishouseloan(LoanType,LoanAmount,LoanTenure); 
isbusinessloan(LoanType,LoanAmount,LoanTenure); 
iscarloan(LoanType,LoanAmount,LoanTenure). 

वास्तव में, मैं चाहे ऋण प्रकार विशेष ऋण की आवश्यकता को पूरा और सामान्य नियम के साथ गठबंधन है की जाँच की जरूरत है।

दूसरे शब्दों में, मुझे इस तरह के नियम को परिभाषित करने की आवश्यकता है।

Ci == 'malaysian', Age >= 18,C > 500, 
I > (LoanAmount/LoanTenure)/12, 
isguarantor(Guarantor,Name) 
    Or with (ispersonalloan(LoanType,LoanAmount,LoanTenure); 
      ishouseloan(LoanType,LoanAmount,LoanTenure); 
      isbusinessloan(LoanType,LoanAmount,LoanTenure); 
      iscarloan(LoanType,LoanAmount,LoanTenur) 

इसे कमांड लाइन में एकाधिक कथन के बजाय 1 सत्य/गलत वापस करना चाहिए।

प्रत्येक नियम या नियम 1 बूलियन मान लौटाता है जो मैं आदेश पंक्ति में नियम की जांच करने के बाद नहीं चाहता हूं। मुझे इस तरह की आवश्यकता है (सामान्य नियम & (एकाधिक या नियम))।

कितने या नियम को जोड़ना है जो 1 बूलियन मान लौटाता है?

कृपया मदद करें।

धन्यवाद।

उत्तर

3

once के साथ बस अपने सभी "या" लक्ष्यों को घेर लें।

उदा।

once(
ispersonalloan(LoanType,LoanAmount,LoanTenure); 
ishouseloan(LoanType,LoanAmount,LoanTenure); 
isbusinessloan(LoanType,LoanAmount,LoanTenure); 
iscarloan(LoanType,LoanAmount,LoanTenure) 
). 

अब, "या" लक्ष्य या तो सफल या असफल हो जाते हैं।

+1

धन्यवाद। समस्या सुलझ गयी। – peterwkc

0

सबसे पहले आपको अपने लक्ष्य के चारों ओर के साथ ( और ) डालना चाहिए। क्योंकि वर्तमान में यह customer(...),...,isguarantor(Guarantor,Name), ispersonalloan(...), ishouseloan(...), ..., iscarloan(...) के संयोजन की तरह व्याख्या करता है। ऐसा इसलिए है क्योंकि ऑपरेटर , और ; की विभिन्न प्राथमिकताओं।

असल में ; - वास्तविक "या", "पारस्परिक अनन्य" नहीं है और "अन्य मामले में" नहीं है। तो अगर आपके पास "इशौसेलोन" एक साथ सफल हो सकता है, तो आपके पास कई सफल लक्ष्य होंगे। इस उदाहरण में once/1 (और साथ not(not(...))) में मदद मिल सकती है, लेकिन आप की तरह गैर everlapping लक्ष्य निर्दिष्ट अपने कार्य के साथ गहरा prolog पाने के लिए कोशिश करते हैं और कर सकते हैं (मैं isXXX अतिव्यापी के बारे में कुछ व्यक्तिगत मान्यताओं करते हैं):

isloan(LT, Am, T):- 
    (ishouseloan(LT,Am,T) 
    ;iscarloan(LT,AM,T) 
    ;not((ishouseloan(LT,Am,T);iscarloan(LT,AM,T))), 
    (ispersonalloan(LT,Am,T) 
    ;isbusinessloan(LT,Am,T) 
    ) 
) 

इस में यदि आप LT, Am और T पर सभी ऋण उत्पन्न करने में सक्षम होना चाहिए तो यह अभी तक विशिष्ट मानों से बंधे नहीं है और isXXX निःशुल्क चर बाध्य कर सकते हैं।

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