2012-12-20 20 views
6

एक ही लंबाई की दो सूचियों के बीच आलोचनात्मक दूरी की गणना करने के लिए पर निर्भर है, मैं hamm/4 की इस परिभाषा के साथ foldl(hamm, A, B, 0, R). का उपयोग करें:शासन आदेश

hamm(A, A, V, V) :- !. 
hamm(A, B, V0, V1) :- A \= B, V1 is V0 + 1. 

पहला नियम में कटौती अनावश्यक बैक ट्रैकिंग से बचाता है। दूसरा नियम है, तथापि, अलग ढंग से लिखा गया हो सकता:

hamm2(A, A, V, V) :- !. 
hamm2(_, _, V0, V1) :- V1 is V0 + 1. 

और hamm2/4 अभी भी foldl/5 साथ या प्रश्नों जहां दोनों ए और बी का आधार हैं, के लिए एक साथ सही हो जाएगा।

तो क्या एक दूसरे को पसंद करने का वास्तव में एक अच्छा कारण है? या क्या नियमों को उस क्रम में रखने या उन्हें चारों ओर बदलने का कोई कारण है?

मुझे पता है कि क्वेरी

hamm(a, B, 0, 1). 

गलत है, जबकि

hamm2(a, B, 0, 1). 

सही है, लेकिन मैं काफी तय नहीं कर सकता जो एक और समझ में आता है। । ।

उत्तर

-1

आपने पहले से ही उन परिभाषाओं के बीच मतभेदों को देखा है: दक्षता के अलावा, आपको अपनी आवश्यकताओं के बारे में निर्णय लेना चाहिए। क्या आप अपने डेटा संरचनाओं में चर स्वीकार करने जा रहे हैं? ऐसी प्रोग्रामिंग शैली कुछ उन्नत प्रोलॉग सुविधाओं (अपूर्ण डेटा संरचनाओं) पेश करती है।

वैसे भी, मुझे लगता है कि पहला रूप अधिक सटीक है (के बारे में वास्तव में यकीन नहीं, मैं दृढ़ कहेंगे 4 डिग्री तर्क पर)

?- hamm(a, B, 0, 1). 
false. 

?- hamm(a, B, 0, 0). 
B = a. 

जबकि hamm2

?- hamm2(a, B, 0, 1). 
true. 

?- hamm2(a, B, 0, 0). 
B = a. 
+0

आप तर्क दे सकता है, 'hamm2 के लिए (ए, बी, 0, 1)', हाँ, बी नहीं है ए के समान, इसलिए इन दो तत्वों को हथौड़ा दूरी में जोड़ना चाहिए ... लेकिन जैसा कि मैंने कहा, मैं यह भी तय नहीं कर सकता कि यह कब समझ में आएगा। –

2

ओ पी है हैमिंग दूरी (hamm/4 और hamm2/4) की गणना के लिए दो संचयी-शैली की भविष्यवाणी की गई, लेकिन यह सुनिश्चित नहीं था कि किसने और समझ में बनाया है।

चलो ओपी को परेशान करने वाली क्वेरी को पढ़ें: "क्या कोई एक्स ऐसी दूरी है (ए, एक्स) 1 है?"। यहाँ "उत्तर" हैं Prolog देता है:

?- hamm(a,X,0,1). 
false.       % wrong: should succeed conditionally 
?- hamm2(a,X,0,1).    % wrong: should succeed, but not unconditionally 
true. 
एक तार्किक दृष्टिकोण से

, दोनों कार्यान्वयन ऊपर की परीक्षा में गलत व्यवहार कर। के दृढ़ता के लिए कुछ परीक्षण करते हैं:

?- hamm(a,X,0,1),X=a.   % right 
false. 
?- hamm(a,X,0,1),X=b.   % wrong: should succeed as distance(a,b) is 1 
false. 

?- hamm2(a,X,0,1),X=a.   % wrong: should fail as distance(a,a) is 0 
X = a. 
?- hamm2(a,X,0,1),X=b.   % right 
X = b. 

नोट पिछले प्रश्नों में hamm/4 ठीक ही विफल हो जाता है कि जब hamm2/4 को गलत तरीके से सफल रहा, और उपाध्यक्ष प्रतिकूल। तो दोनों आधे दाएं/आधा गलत हैं, और न तो एक दृढ़ है।


क्या किया जा सकता है?hamm3/4 का उपयोग कर

:- use_module(library(clpfd)). 

hamm3(A,B,V0,V) :- 
    if_(A = B, V0 = V, V #= V0+1). 

अब प्रश्नों ऊपर दोहराएँ:

?- hamm3(a,X,0,1). 
dif(X,a). 
?- hamm3(a,X,0,1),X=a. 
false. 
?- hamm3(a,X,0,1),X=b. 
X = b. 

पर if_/3 और (=)/3this answer में @false द्वारा प्रस्तुत आधार पर, मैं विधेय hamm3/4 निम्नलिखित शुद्ध कोड लागू किया यह काम करता हैं! अंत में, के सबसे सामान्य क्वेरीhamm3/4 की पूरी समाधान सेट को देखने के लिए पूछना है:

?- hamm3(A,B,N0,N). 
A = B, N0 = N ; 
dif(A,B), N0+1 #= N.