2012-02-12 10 views
13

मुझे अपनी एआई कक्षा के लिए प्रोलॉग होमवर्क के साथ कुछ मदद की ज़रूरत है। सवाल आइंस्टीन की पहेली के लिए प्रोलॉग कोड लिखना है। मुझे पता है कि इसे खुद कैसे लिखना है, लेकिन होमवर्क में कुछ बाधाएं हैं।एन्स्टिन्स पहेली प्रोलॉग

there are 5 houses 
the Englishman lives in the red house 
the Spaniard owns the dog 
coffee is drunk in the green house 
the Ukrainian drinks tea 
the green house is immediately to the right of the ivory house 
the Old Gold smoker owns snails 
Kools are smoked in the yellow house 
milk is drunk in the middle house 
the Norwegian lives in the first house 
the man who smokes Chesterelds lives in the house next to the man with the fox 
3 Kools are smoked in the house next to the house where the horse is kept 
the Lucky Strike smoker drinks orange juice 
the Japanese smokes Parliaments 
the Norwegian lives next to the blue house 

मुझे पता है कि मुझे घरों के लिए सूची का उपयोग करने की आवश्यकता है क्योंकि उन्हें आदेश दिया गया है। मैं घर की विशेषताओं के लिए भी सूची का उपयोग करना चाहता था लेकिन मुझे यहां एक समस्या मिली।

मैं अज्ञात चर घर (अंग्रेजी, लाल, _, _, _) का उपयोग करने जा रहा था। लेकिन मुझे नहीं पता कि होमवर्क के लिए इसका व्याख्या कैसे करें।

यहाँ की कमी कर रहे हैं: आप निम्नलिखित द्विआधारी विधेय प्रतीकों का उपयोग करना चाहिए:

owns(N,Pet) 
smokes(N, Cigarette). 
drinks(N, Drink). 

उसके अलावा आप विधेय के किसी भी संख्या का उपयोग करने के लिए स्वतंत्र हैं।

यहाँ

कैसे मैं तथ्यों प्रारंभ लेकिन मुझे पता है कि इस मामले

next_to(X,Y) :- right_of(X,Y); right_of(Y,X). 

owns(spaniard, dog). 
drinks(ukrainian, tea). 
smokes(japanese, parliaments). 
right_of(ivory, green). 
lives(englishman, red). 
owns(X, snail) :- smokes(X, old_gold). 
smokes(X, kools) :- owns(X, yellow). 
smokes(X, lucky_strike) :- drinks(X, orange_juice). 
drinks(X, coffee) :- owns(X, green_house). 

यह भावना एक छोटा सा बना देता है, लेकिन यह एक ही समय में पूरी तरह से गलत लग रहा है में नियम बनाने के लिए न है। मुझे नहीं लगता कि मैं इस के साथ कहीं भी जा सकता हूं। :/

+1

tbh, मुझे लगता है कि ये बाधाएं डेटा के इतने उपयुक्त प्रतिनिधित्व को लागू नहीं करती हैं और इसलिए परिणामस्वरूप अजीब/नहीं तो सुरुचिपूर्ण कोड होता है। मैंने अपने पहले ले पर समान भविष्यवाणियों का उपयोग किया लेकिन फ़ाइल को थोड़ा सा ट्रैश करने के बाद (अंतिम समाधान: [http://users.ntua.gr/el06009/files/zebra.pl])। वास्तव में उपयोगी टिप्पणी के लिए खेद है, बस यह कहना चाहता था कि, आईएमओ, ये बाधाएं वास्तव में खराब हैं:/ –

+0

@ थानोसक्यूआर एक प्रोलॉग समाधान [यहां] (http://stackoverflow.com/a/8270393/849891) है। मुझे लगता है कि यह सुरुचिपूर्ण और अच्छा है। :) कुंजी निर्माण से 'diff' बाधा संतुष्ट * प्राप्त करने के लिए, डोमेन से एक साथ पारस्परिक-विशिष्ट विकल्प बनाने के लिए 'चयन' का उपयोग कर रही है *। –

+0

@WillNess अच्छी तरह से, आप 'मालिक/2',' धूम्रपान/2' और 'पेय/2' का उपयोग नहीं कर रहे हैं, है ना? मैं वास्तव में यह नहीं कह रहा हूं कि आपके पास प्रोलॉग में एक सुरुचिपूर्ण समाधान नहीं हो सकता है (इसके विपरीत, मुझे लगता है कि मेरा समाधान तब तक बहुत ही सुरुचिपूर्ण है जब तक मैंने आपका देखा नहीं (उपर्युक्त लिंक टूटा हुआ है https://github.com/ thanosqr/side_projects/blob/master/zebra_puzzle.pl)), बस होमवर्क की बाधाओं को एक सुरुचिपूर्ण समाधान –

उत्तर

11

This site सीएलपी (एफडी) के साथ ऐसे पहेली को हल करने के लिए समर्पित है। लेकिन सीएलपी (एफडी) की पूरी शक्ति यहां अधिक है: जब आप पर्याप्त रूप से बाधाओं का वर्णन करते हैं तो आपके असाइनमेंट को पूरी समाधान स्थान को प्रभावी रूप से खोजा जा सकता है।

समाधान 5 घरों से बना होगा, जहां प्रत्येक विशेषता वर्णन द्वारा लगाई गई सभी बाधाओं को पूरा करती है।

प्रत्येक विशेषता के लिए बहुत ही प्रतीक का उपयोग करने के बारे में पता (अर्थात हरी और green_house गलत है, उनमें से एक का चयन)।

इसके अलावा अगला भी गलत लगता है: यदि आप 1 से 5 तक की संख्या रखते हैं, तो इसकी गणना या गणना की जा सकती है, लेकिन तत्काल पड़ोसी को संदर्भित किया जाता है।

तो 'समाधान खोज अंतरिक्ष' डेटा प्रतिनिधित्व, जैसे

Problem = [ 
house(1, Nationality1, Color1, Pet1, Drinks1, Smokes1), 
house(2, Nationality2, Color2, Pet2, Drinks2, Smokes2), 
... 
], 
% place constraints 
member(house(_, englishman, red, _, _, _), Problem), 
member(house(_, spaniard, _, dog, _, _), Problem), 
... 

सदस्य/2 यह सरल Prolog निर्मित है कुछ को पूरा है, लेकिन इस मामले में समस्या को हल करने पर्याप्त होता: जब सभी बाधाओं पोस्ट किए गए हैं, चर उचित मूल्यों से बंधे होंगे। कुंजी पर सदस्य की क्षमता निर्धारित नहीं है समाधान के सदस्य (डुह) का चयन करें।

तो जब आपको 2 अलग-अलग तत्वों के बीच बाधा व्यक्त करने की आवश्यकता होती है, तो 2 बार सदस्य का आह्वान करें, और उचित चर के बीच बाधाएं रखें: यानी।

आदमी है जो Chesterelds धूम्रपान करता है अगले लोमड़ी के साथ आदमी

...., 
member(house(N, _, _, _, _, chesterelds), Problem), 
member(house(M, _, _, fox, _, _), Problem), 
next_to(N, M), 
... 

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

मैं आपको 'ज्यामितीय' भविष्यवाणियों के सही प्रतिनिधित्व के बारे में सोचने दूँगा: next_to और right_of अंकगणित के माध्यम से समझा जा सकता है या व्यक्त किया जा सकता है।

3

एक प्रोलॉग अनुवाद सीधे हो सकता है वार्ड, नियम द्वारा नियम, अभी भी instantiating the domain by selecting from it के प्रतिमान का उपयोग कर रहे हैं। यहां यह घर विशेषताओं का डोमेन है; linked answer में घर विशेषताओं को मानव प्रोग्रामर द्वारा तय किया जाता है और डोमेन वास्तविक निवास घर है, जो एक बहुत ही संक्षिप्त एन्कोडिंग की अनुमति देता है।

दूसरे शब्दों में अंतर अंकन में है: एक परिष्कृत अंकन हमें आधे रास्ते वहाँ पहले से ही लेता है, लेकिन यह एक इंसान हूं जो यह आविष्कार किया था और यह पीछा किया (जैसे एक प्रोग्रामर होने में norwegian लिख पहले घर का विनिर्देश), कंप्यूटर नहीं। यहां हम होमवर्क की बाधाओं के बाद कोड में जितना संभव हो उतना मानव ज्ञान डालने का प्रयास करते हैं। (हालांकि कुछ भी निश्चित रूप से बहस योग्य है, और मानव हस्तक्षेप को छोड़ने में परम एक कंप्यूटर प्रोग्राम होगा जो अंग्रेजी पाठ को अपने इनपुट के रूप में लेता है ... जो फिर से आलोचना के लिए खुलेगा कि इस कार्यक्रम को कैसे हल किया जाए, यह विशिष्ट पहेली, या पहेली के प्रकार)

जाहिर है, सवाल गुम है। यह होना चाहिए "जो पानी पीता है? जो ज़ेबरा का मालिक है?":

zebra(Z,W,HS):-   
    length(HS, 5),  % nation? color? what's that? define it later... 
    member(H1, HS), nation(H1, eng),  color(H1, red), 
    member(H2, HS), nation(H2, spa),  owns(H2, dog),    
    member(H3, HS), drink(H3, coffee), color(H3, green),   
    member(H4, HS), nation(H4, ukr),  drink(H4, tea), 
    right_of(B,A, HS), color( A, ivory),  color(B, green), 
    member(H5, HS), smoke(H5, oldgold), owns(H5, snails), 
    member(H6, HS), smoke(H6, kools),  color(H6, yellow), 
    middle(C,  HS), drink( C, milk), 
    first( D,  HS), nation(D, nor), 
    next_to(E,F, HS), smoke( E, chester), owns( F, fox), 
    next_to(G,H, HS), smoke( G, kools),  owns( H, horse), 
    member(H7, HS), smoke(H7, lucky),  drink(H7, orange), 
    member(H8, HS), nation(H8, jpn),  smoke(H8, parlamt), 
    next_to(I,J, HS), nation(I, nor),  color(J, blue), 
    member(W,  HS), drink( W, water), 
    member(Z,  HS), owns( Z, zebra). 

right_of(B,A,HS):- append(_,[A,B|_],HS). 
next_to(A,B,HS):- right_of(B,A,HS) ; right_of(B,A,HS). 
middle(A, [_,_,A,_,_]). 
first(A, [A|_]). 

attr(House, Attr-Value):- 
    memberchk(Attr-X, House),   % unique attribute names 
    X = Value. 
nation(H, V):- attr(H, nation-V). 
owns( H, V):- attr(H, owns-V).  % select an attribute 
smoke(H, V):- attr(H, smoke-V).  % from an extensible record 
color(H, V):- attr(H, color-V).  % of house attributes 
drink(H, V):- attr(H, drink-V).  % which *is* a house 

परीक्षण,

3 ?- time((zebra(Z,W,_),maplist(nation,[Z,W],R),writeln(R),false ; true)). 
[jpn,nor] 
% 181,101 inferences, 0.070 CPU in 0.080 seconds (88% CPU, 2567888 Lips) 
true. 

यहाँ कैसे घरों अंत परिभाषित किया जा रहा है:

5 ?- zebra(_,_,HS),maplist(writeln,HS),false. 
[smoke-kools, color-yellow, nation-nor, owns-fox,  drink-water |_G859] 
[nation-ukr, drink-tea, smoke-chester, owns-horse, color-blue |_G853] 
[nation-eng, color-red, smoke-oldgold, owns-snails, drink-milk |_G775] 
[nation-spa, owns-dog,  color-ivory, smoke-lucky, drink-orange|_G826] 
[drink-coffee, color-green, nation-jpn, smoke-parlamt, owns-zebra |_G865] 
false. 

या, विशेषताओं के साथ हल कर (और" स्थिर "फिक्सिंग के द्वारा अपने लंबाई),

7 ?- zebra(_,_,HS),maplist(length,HS,_),!,maplist(sort,HS,S),maplist(writeln,S),false. 
[color-yellow, drink-water, nation-nor, owns-fox, smoke-kools ] 
[color-blue, drink-tea, nation-ukr, owns-horse, smoke-chester] 
[color-red, drink-milk, nation-eng, owns-snails, smoke-oldgold] 
[color-ivory, drink-orange, nation-spa, owns-dog, smoke-lucky ] 
[color-green, drink-coffee, nation-jpn, owns-zebra, smoke-parlamt] 
false. 
+2

मैं एसओ टू ईओ का नाम बदलने के लिए वोट देता हूं: आइंस्टीन ओवरफ्लो – false

+4

कम से कम, एक टैग, कृपया। इस तरह के पहेली के लिए एक सामान्य नाम नहीं है: कुछ तालिकाओं को चित्रित करके हल किया जा सकता है। आइंस्टीन ने यही सोचा - और उन्होंने दावा किया कि केवल छोटे प्रतिशत ही इसे हल करने में सक्षम हैं। हां, वह छोटा प्रतिशत यहां SO पर है! – false

+1

यहां यह थोड़ा अलग है: वे नहीं चाहते हैं कि हम "एक टेबल खींचें", लेकिन कंप्यूटर पर "मालिक", "धूम्रपान" आदि कहने का एक तरीका खोजा। यही कारण है कि मैंने यह जवाब जोड़ने का फैसला किया। मुझे लगता है कि यह काफी अलग दृष्टिकोण है। –