2012-11-21 136 views
3

有沒有辦法在序言中寫非同源列表?
我想創建一個包含符號和整數的列表。喜歡的東西: [A 2 3 B C D E]序言非均勻列表

感謝

附:我用戶Turbo Prolog 2.0

回答

2

的Turbo Prolog的要求列表元素是一個單一的類型。 但是有一個解決方法 - 你只需要定義一個可以代表整數和符號的單一類型。您可以通過定義複合域來完成此操作,其中每種不同的類型都使用不同的函子進行包裝。因此,舉例來說:

mixed_type = i(integer); s(symbol). 
mixed_list = mixed_type*. 

的缺點是,你需要周圍的每一個列表元素的函子,這是一個有點尷尬:

[s(a), i(2), i(3), s(b), s(c)] 
+0

謝謝@Nick,這正是我需要的!祝你有美好的一天! –

1

是的,在Prolog中沒有類型。你必須寫引號大寫字母: [ 'A',2,3, 'B', 'C' 'd', 'E',F,G]

+0

OK OK,但我怎麼把它定義爲一個域名?因爲當我嘗試將符號與整數混合在一起時,它給了我:「類型錯誤:錯誤的對象類型」 –

+0

@AdiUlici您可以給出一些上下文嗎?聽起來像是閱讀列表中抱怨類型的列表,而不是Prolog本身。 –

+0

好吧,如果我想創建一個整數列表,我創建一個域'list = integer *',但是如果我想用整數和符號創建一個列表,我該怎麼寫呢?我忘了提及,我使用了一個較老的prolog:Turbo Prolog 2.0 –

2

Prolog的僅具有一種數據類型,所以每個列表是同質的。

Prolog中的每個元素只是一個術語a是一個術語,a(x,y)是一個術語,3是一個術語,並且在語言中沒有任何東西可以區分它們。當然,大量的內置謂詞根據類型進行區分 - 你不能期望從X is 1 + a得到答案 - 但是在語言本身中沒有區別。

因此,要回答你的問題,你可以把絕對任何你想在你的名單,其中包括以上所有的 - 下面是有效的Prolog:

L = [a, a(x,y), 3, X is 1 + a]. 
+0

當然有* *操作歧視類型... – CapelliC

+0

@CapelliC當然有很多內置的謂詞有一個類型的概念,作爲圖書館的一部分,並非語言的真正組成部分。在純粹的Prolog中,我唯一可以算作「操作」的東西是規則查找和術語統一。 –