2017-11-10 9 views
7

में विभिन्न परिणाम नमूना कार्यक्रम 8-रानी समाधानों की संख्या को दर्शाता है और गणना करता है।swi-prolog और yap

[user]. 
(perm([X|Y],Z) :- (perm(Y,W),takeout(X,Z,W))). 
perm([],[]). 
takeout(X,[X|R],R). 
(takeout(X,[F|R],[F|S]) :- (takeout(X,R,S))). 
(solve(P) :- (perm([1,2,3,4,5,6,7,8],P),combine([1,2,3,4,5,6,7,8],P,S,D),alldiff(S),alldiff(D))). 
(combine([X1|X],[Y1|Y],[S1|S],[D1|D]) :- (is(S1,+(X1,Y1)),is(D1,-(X1,Y1)),combine(X,Y,S,D))). 
combine([],[],[],[]). 
(alldiff([X|Y]) :- (\+ member(X,Y),alldiff(Y))). 
alldiff([X]). 
end_of_file. 

क्वेरी:

(setof(P,solve(P),Set),length(Set,L),write(L),write('\n'),fail). 

swipl

नियम, (। खेद कोड को पढ़ने के लिए मुश्किल है अगर इस मशीन द्वारा जेनरेट एक एस-अभिव्यक्ति से है मूल कोड https://www.cpp.edu/~jrfisher/www/prolog_tutorial/2_11.html है) 92 लौटाता है; जबकि yap 40320 देता है। इसके अलावा, जब मैं solve(P) क्वेरी करता हूं, तो swipl केवल दो समाधान देता है (जो 92 के विपरीत भी है); याप बहुत अधिक लौटाता है (संभवतः उनमें से 40320)। तो अंतर क्यों? क्या ऐसी गंभीर संगतता समस्या है?

संस्करण:

  • YAP 6.2.2 (x86_64-linux): शनि सितं, 17 13:59:03 यूटीसी 2016
  • SWI-Prolog amd64 के लिए संस्करण 7.2.3
+0

क्या आप अभी भी कोड को एक पठनीय रूप में डाल सकते हैं? – false

+0

लिंक –

+1

लिंक में मूल एक है अगली बार, कृपया यहां पठनीय संस्करण शामिल करने के लिए। एसओ काम करता है। – false

उत्तर

7

वाईएपी के पुराने संस्करणों में, एक अपरिभाषित भविष्यवाणी के लिए एक क्वेरी बस विफल रही। उपर्युक्त मामले में, यह member/2 है जिसे YAP में परिभाषित नहीं किया गया है। और इस कारण से आपका परीक्षण alldif/1 हमेशा सफल होता है - इस प्रकार आपको बड़ी संख्या मिलती है।

इसका व्यवहार प्रोलॉग ध्वज unknown द्वारा शासित है जिसका डिफ़ॉल्ट मान error होना चाहिए। YAP 6.2 में डिफ़ॉल्ट (गलत) fail था। इसे 6.3 में ठीक किया गया था।

:- set_prolog_flag(unknown, error). 

अपरिभाषित भविष्यवाणियों के लिए एक साफ़ त्रुटि प्राप्त करने के लिए कहें। फिर, आपको member/2 को परिभाषित करने की आवश्यकता होगी।

+2

धन्यवाद, इसलिए 'सदस्य' अंतर्निर्मित नहीं है ... लेकिन उन "प्रस्तावना" (संगतता परत, प्रकार) अच्छा लगता है। प्रक्रिया शुरू होने पर मैं इसे लोड करने के लिए lisp-to-prolog लाइब्रेरी बना सकता हूं। –

+0

हम्म, वैसे, बस '.configure' के बाद, #.3 क्लोन किया गया है, यह 'बनाने के कारण नहीं बनता है: *** लक्ष्य बनाने के लिए कोई नियम नहीं' H/dglobals.h ',' yap ' '। रुको। '... –

+0

आश्चर्य है कि अन्य सीएसपी समुदाय की तुलना में मानकीकरण इतनी खराब क्यों चल रहा है। मिनिज़िन सीएसपी में एक आम प्रारूप है और सालाना प्रतिस्पर्धा कर रहा है। एसएटी में डीआईएमएसीएस और एसएमटी के पास भी एक है। –

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