2010-06-05 14 views
5

मैं प्रोलॉग के लिए नया हूं। मुझे एक पूर्णांक योजक लिखना होगा जो 0-9 के बीच संख्याओं को 0-9 के बीच जोड़ देगा और समाधान 0-18 का उत्पादन करेगा। यह मुझे क्या करना चाहते हैं:प्रोलॉग शुरुआती: अंकगणितीय तुलना ऑपरेटर के साथ एकजुट कैसे करें या मूल्यों की श्रेणी के लिए एक सेट var कैसे प्राप्त करें

% pseudo code 
add(in1, in2, out) :- 
    in1 < 10, 
    in2 < 10, 
    out < 18. 

मैं इसे इस तरह कॉल करने के लिए सक्षम होने के लिए करना चाहते हैं:

?- add(1,2,3). 
true. 
?- add(1,2,4). 
false. 

एक साथ लापता: यदि यह एक वैध है

जाँच करने के लिए चर:

?- add(X,2,3). 
X = 1. 
?- add(1,4,X). 
X = 5. 
कई लापता वैरिएबल की मदद से

:

?- add(X,Y,Z). 
% Some output that would make sense. Some examples could be: 
X=1, Y=1, Z=2 ; 
X=2, Y=1, Z=3 ...... 

मुझे एहसास है कि यह शायद एक बहुत ही सरल सवाल है और यह शायद बहुत सरल है। हालांकि, Prolog tutorial के अनुसार मैं उपयोग कर रहा हूँ:

"एकीकरण के विपरीत अंकगणित तुलना ऑपरेटर्स ऑपरेटरों एक चर के लिए मान देने के लिए इस्तेमाल नहीं किया जा सकता है जब हर तरफ हर शब्द instantiated कर दिया है केवल मूल्यांकन किया जा सकता।।"

उत्तर

0

समाधान: ?:

lessThanTen(9). 
lessThanTen(8). 
lessThanTen(7). 
lessThanTen(6). 
lessThanTen(5). 
lessThanTen(4). 
lessThanTen(3). 
lessThanTen(2). 
lessThanTen(1). 
lessThanTen(0). 

addSimple(Add1,Add2,Sol) :- 
    lessThanTen(Add1), 
    lessThanTen(Add2), 
    Sol is Add1+Add2. 
1

क्या इस बारे में

add(X,Y,Z) :- 
     Z is X + Y, 
     X < 10, 
     Y < 10, 
     Z < 19. 

समस्या: इस फार्म add(1,1,X) क्योंकि Z के < कॉल से पहले instantiated के प्रश्नों के लिए अच्छी तरह से काम करता है, लेकिन विफल रहता है जब आप add(X,1,2) पूछते हैं। आप प्रकार की क्वेरी को अलग करने के लिए var/1 का उपयोग कर सकते हैं (var/1 आपको बताता है कि एक चर के अनइंस्टेन्टेड या नहीं), लेकिन यह बहुत दर्द की तरह लगता है।

+0

हाँ जो काम नहीं करता है क्योंकि आपने अपने उत्तर में जो वर्णन किया है। – sixtyfootersdude

6

सभी आधुनिक प्रोलॉग सिस्टम परिमित डोमेन बाधाएं प्रदान करते हैं, जो कि वास्तविक संबंध हैं जो (निम्न स्तर के अंकगणितीय भविष्यवाणियों के विपरीत/2 और>/2) के विपरीत सभी दिशाओं में उपयोग किए जा सकते हैं। आपके उदाहरण के लिए

:- use_module(library(clpfd)). 

plus(X, Y, Z) :- 
     [X,Y] ins 0..9, 
     X + Y #= Z. 

परिणाम:: SWI-Prolog में

?- plus(1,2,3). 
true. 

?- plus(1,2,4). 
false. 

?- plus(X,2,3). 
X = 1. 

?- plus(1,4,X). 
X = 5. 

?- plus(X,Y,Z). 
X in 0..9, 
X+Y#=Z, 
Y in 0..9, 
Z in 0..18. 

के बाद से विधेय सभी दिशाओं में इस्तेमाल किया जा सकता, यह अब कोई मतलब है कि यह कॉल करने के लिए "/ 3 जोड़ें", के रूप में जो एक दिशा का संकेत देगा, लेकिन भविष्यवाणी वास्तव में बताती है कि संबंध कब होता है और इस प्रकार यह अधिक सामान्य होता है।