मैं प्रोलॉग में कोग व्हील्स का एक सेट मॉडल करने की कोशिश कर रहा हूं। और यह पता लगाने के लिए कि क्या दो पहिये दूसरों की श्रृंखला से जुड़े हुए हैं।

मेरे पास एक साधारण रिकर्सन है:

connected(X,Y) :-   
    engages(X,Y).

connected(X,Y) :-
    engages(X,Z),
    connected(Z,Y).

अगर मैं एक हार्ड-वायर्ड विधेय के संदर्भ में संलग्न को परिभाषित करता हूं:

engages(X,Y) :- touches(X,Y).

तथा

touches(z1,z2).
touches(z2,z3).
touches(z3,z4).

तब यह काम करता है।

का एक परीक्षण

connected(z1,z4).

सच पैदा करता है और

connected(z1,z5).

झूठ पैदा करता है।

हालांकि, अगर मैं अपने स्पर्शों को गणना के साथ भविष्यवाणी करता हूं (कि दो त्रिज्या का योग मोटे तौर पर दो केंद्रों के बीच की दूरी है), तो यह खोज अनंत रिकर्सन (स्टैक ओवरफ़्लो) की तरह दिखती है जब उत्तर गलत होना चाहिए .

ऐसा क्यों होना चाहिए, यह देखते हुए कि मेरी "स्पर्श" गणना स्वयं "कनेक्टेड" फ़नकार को नहीं बुलाती है? क्या ऐसा इसलिए है क्योंकि एक स्पर्श फ़नकार स्पष्ट विधेय की तुलना में अधिक परमाणुओं से मेल खाने की कोशिश करने जा रहा है?

यह, मोटे तौर पर, मेरा परिकलित स्पर्श है (A और B पहिए हैं, ARAD और BRAD उनकी त्रिज्या हैं, D दूरी है और लगभग एक "लगभग बराबर" फ़ंक्शन है।

touches(A,B) :- 
    wheel(A,_,_,ARAD),
    wheel(B,_,_,BRAD),
    distance(A,B,D),
    approx(D,(ARAD+BRAD),2),
    A \== B.
0
interstar 11 अप्रैल 2011, 22:40

1 उत्तर

सबसे बढ़िया उत्तर

अनंत रिकर्सन होता है क्योंकि प्रोग्राम चक्रों की जांच नहीं करता है। यहाँ क्या हो सकता है:

  1. कार्यक्रम में पहिए A और B मिलते हैं, जो स्पर्श करते हैं।
  2. B को देखते हुए, यह एक ऐसे पहिये की तलाश करता है जो स्पर्श करे। यह A पाता है।
  3. गोटो 1.

आप इसे connected के अतिरिक्त तर्क में पहले से माने गए पहियों के "बंद सेट" को बनाए रखने से रोक सकते हैं:

connected(X,Y) :-
    connected(X,Y,[]).
connected(X,Y,Closed) :-
    touches(X,Y),
    \+ memberchk(Y,Closed).
connected(X,Z,Closed) :-
    touches(X,Y),
    \+ memberchk(Y,Closed),
    connected(Y,Z,[Y|Closed]).

(पाठक के लिए व्यायाम: इसे छोटा करें।)

3
Fred Foo 11 अप्रैल 2011, 23:21
ठीक है। और यह केवल दूसरे मामले में होता है, जहां स्पर्श की गणना की जाती है, क्योंकि वह वह है जहां स्पर्श (ए, बी) और स्पर्श (बी, ए) दोनों सत्य हैं। मुझे यह कोशिश करने दो ...
 – 
interstar
11 अप्रैल 2011, 23:29
ठीक, बहुत अच्छा। धन्यवाद। :-)
 – 
interstar
11 अप्रैल 2011, 23:42