2011-09-07 26 views
5

Okul için daha büyük bir görevle ilgili sorun giderme yaparken, tek bir öğe gibi tek bir öğe listesi (bir öğe ile bir yığın) işlem yaptığımı yaptığım bir hata buldum.Prolog: tek öğe vs tek bir öğe listesi

48 ?- 1 is [1]. 
true. 

49 ?- -1 is [-1]. 
ERROR: is/2: Type error: `character' expected, found `-1' 

50 ?- 0.66 is [0.66]. 
ERROR: is/2: Type error: `character' expected, found `0.66' 

Benzer davranış = kullanılarak yapılmaktadır: =/2 yerine/2'dir ben fark ettim garipliği ancak başka testlerde, sorunumu çözdü. Dolayısıyla, herhangi bir sebepten dolayı, tek bir öğe listesi tek bir öğe ile aynı olarak kabul edilir, ancak yalnızca negatif olmayan tamsayılar içindir.

Merak, her şeyden çok ... kimse bunun nedenini biliyor mu?

Teşekkürler! SWI-Prolog (ve muhtemelen başka durumlarda)

cevap

4

, bu is/2 ve =:=/2 tarafından değerlendirilmesi için ifadeler backward compatibility implementation ile ilgilidir:

karakter kodları negatif olmayan tam sayılardır gibi
.(+Int,[]) 

A list of one element evaluates to the element. This implies "a" evaluates to 
the character code of the letter `a' (97). This option is available for 
compatibility only. It will not work if `style_check(+string)' is active as "a" 
will then be transformed into a string object. The recommended way to specify the 
character code of the letter `a' is 0'a. 

, bu açıklayabilir neden davranış Görüyorsunuz sadece böyle sayılar için çalışır ve kayan nokta ve negatif sayılar değil.

+0

Teşekkürler! Bu cevap "97" [a] olarak görünüyor. doğru. Ancak, belki ben bir aptalım, ama bu el kitabında ne anlatıldığını tam olarak anlayamıyorum. Listelenen (min, max, abs, vb) yüklemler benim için var görünmüyor ve neden tüm argümanlar önünde + işaretler var anlamıyorum. Ve bu Q ile ilgili yüklemenin neden iki argümanı olan bir nokta olduğunu anlamıyorum, böyle bir şey kullanmıyorum. – The111

+2

Bu sayfa SWI-Prolog hakkında; belki de uygulamanız min, max, vs. desteklemiyor mu? Bazı argümanlar, + + ile önceliğe sahiptir, çünkü bu, modu gösterir, yani, + ', bağlı (ve değişken değil) anlamına gelir. Son olarak, sözdizimi '[a, b]' '/ 2' listesi yapıcı yüklemi için kısaydı (yani aslında'. (A,. (B, [])) '). Sizin durumunuzda, [1] 'gibi tek tamsayı bir liste' (1, []) 'için kısaydı. – sharky

+0

Tamam, büyük açıklamalar ... Sanırım şimdi anladım. Tekrar teşekkürler. – The111

İlgili konular