2013-02-28 7 views
6

में निम्न कोड पर विचार करें:काटें और असफल Prolog

a(X) :- b(X),!,c(X),fail. 
a(X) :- d(X). 

b(1). 
b(4). 
c(1). 
c(3). 

d(4). 

क्वेरी a(X). पैदा करता

1 ?- a(X). 
false. 

2 ?- 

लेकिन में इस कोड

a(X) :- b(X),!,c(X). 
a(X) :- d(X). 

b(1). 
b(4). 
c(1). 
c(3). 

d(4). 

क्वेरी के साथ a(X). परिणाम:

1 ?- a(X). 
X = 1. 

तो मेरा सवाल है, fail/1 क्यों झूठा पैदा करता है? यह बैकट्रैकिंग को मजबूर करना है, है ना? तो b(1) और c(1). चेक किया जाएगा, मुझे लगता है, तो यह क्यों विफल हो जाता है?

उत्तर

2

यह विफल रहता है क्योंकि fail विफल होना चाहिए।

कट कट विकल्प को हटा देता है, फिर मानों को मना करता है जो अन्यथा X बाध्यकारी के माध्यम से 'लौटा' जाएगा। ,

a(X) :- b(X),c(X),fail. 
... 

आप मिल जाएगा

?- a(X). 
X = 4. 
+0

लेकिन 'कट/1' केवल' एक्स = 1' चेक करता है, है ना? तो यह 'बी (1)' और 'सी (1)' दोनों की जांच करेगा। क्या मै गलत हु ? – ron

+0

कटौती यह एक बुरा विषय है। देखें कि क्या आप [दस्तावेज़ीकरण] का पालन कर सकते हैं (http://www.swi-prolog.org/pldoc/doc_for?object=!/0) – CapelliC

1

रूप @CapelliC कहा प्रयास करें a(X) :- b(X),!,c(X),fail.चाहिए में विफल रहता है, क्योंकि वह fail घटक के नियम।

1 कोड नमूना से कम - चेकिंग 1 पर शुरू होता है, घटक b(1) संतुष्ट है और इसलिए है कि के बाद यह, ! के लिए मिलता है और नहीं वैकल्पिक जाँच पर अमल होगा।

cut के बारे में अधिक स्पष्टीकरण के लिए, आप a(X) :- b(X),!,c(X),fail.

इस तरह के अंत में ! डाल जांच कर सकते हैं -

a(X) :- b(X),c(X),fail,!. 
a(X) :- d(X). 

b(1). 
b(4). 
c(1). 
c(3). 

d(4). 

और अब -

?- a(X). 
X = 4. 

क्योंकि fail से पहले है ! तो !पहुंच योग्य नहीं है इसलिए cut प्रभावित नहीं होता है और फिर भी एक और वैकल्पिक खाता लेता है।

संपादित करें:

fail केवल शासन वह वहाँ लिखा के लिए प्रासंगिक है, इसलिए a(X) :- b(X),c(X),fail,!. हमेशा के लिए विफलता, लेकिन नहीं a(X) :- d(X). शासन का कारण बनता है जाएगा।

0
a(X) :- b(X),c(X),fail. 
a(X) :- d(X). 

b(1). 
b(4). 
c(1). 
c(3). 

d(4). 

a(X). 
X = 4 


a(X) :- b(X),!,c(X). 
a(X) :- d(X). 

b(1). 
b(4). 
c(1). 
c(3). 

d(4). 

a(X). 
X = 1 

a(X) :- b(X),!,c(X),fail. 
a(X) :- d(X). 

b(1). 
b(4). 
c(1). 
c(3). 

d(4). 

a(X). 
false 
+3

यदि आप अपने उत्तर में कुछ स्पष्टीकरण जोड़ सकते हैं तो मैं अच्छा होगा। –