2011-05-30 8 views
5

मैं एसडब्ल्यूआई प्रोलॉग, सीखने की कोशिश कर रहा हूं लेकिन मेरा सरल कार्यक्रम विफल रहता है जब मुझे विश्वास है कि यह सफल होना चाहिए।प्रोलॉग, अभिव्यक्तियों का उपयोग करके

%My code: 
orthogonal((X1,Y1,Z1),(X2,Y2,Z2)) :- (X1*X2)+(Y1*Y2)+(Z1*Z2)==0. 
integerVector((X,Y,Z)) :- integer(X),integer(Y),integer(Z). 

?-orthogonal((1,0,0),(0,0,1)). 

मैं pseudoemacs विंडो में बफर संकलन दबाएँ और उत्पादन होता है:

% [PATH].pl compiled 0.00 sec, 136 bytes 
ERROR: emacs_prolog_mode ->error_at_location: Argument 1 (int): `int' expected, found `@11470948?start' 
ERROR: emacs_prolog_mode ->error_at_location: Argument 1 (int): `int' expected, found `@11470948?start' 
Warning: [PATH]s.pl:5: 
     Goal (directive) failed: user:orthogonal((1,0,0), (0,0,1)) 

उत्तर

6

आप जो अंकगणित अभिव्यक्ति के रूप में अपने तर्कों का मूल्यांकन करता है (=:=)/2 के स्थान पर (==)/2 इस्तेमाल किया है।

आप (X,Y,Z) का उपयोग कर सकते हैं, लेकिन यह एक तिहाई नहीं है जैसे कि हास्केल। इसे देखने के लिए:

?- write_canonical((1,2,3)). 
','(1,','(2,3)) 

?- (1,2,3) = (X,Y). 
X = 1, 
Y = (2,3). 
+1

ट्रिपल के स्थान पर मुझे क्या उपयोग करना चाहिए? –

+2

@ ऑक्सिनैबॉक्स: या तो अपने सूचियों 3 डी हैं, तो या तो सूचियों का उपयोग करें, या एक मजेदार 'v/3'। –

5

प्रोलॉग में अभिव्यक्ति केवल वाक्य रचनात्मक शब्द पेड़ का प्रतिनिधित्व करती है। एक अभिव्यक्ति का मूल्यांकन करने के लिए आपको X is Y की आवश्यकता है जो वाई को अंकगणितीय अभिव्यक्ति के रूप में मूल्यांकन करता है और एक्स के साथ परिणाम को एकीकृत करता है। वैकल्पिक रूप से आप X =:= Y का उपयोग कर सकते हैं जो अंकगणितीय अभिव्यक्तियों के रूप में एक्स और वाई दोनों का मूल्यांकन करता है, फिर परिणामों को एकीकृत करता है।

चीयर्स!