2011-12-16 49 views
2

我想在Mercury中聲明一個數據類型,它可以具有可變數量的值和名稱。例如:無限制變量名稱在水星中的聲明

type goal ---> pick; give; come. 

有三個變量/值。

我想是這樣的:

type myplayer ---> de value declaration here. 

該變量的數量沒有限制或固定。

因此,我可以使用myplayer聲明像v1, v2, v3 and v4.這樣的值/變量第二次我可以使用它來刪除類似a, b, c, d, e, z, aa, ab and az的東西。

值的數量不受限制,名稱也不固定。

上午在水星,所以我需要一些幫助。

謝謝

+0

你是什麼意思的「第二時間」嗎?你的意思是你想重新定義myplayer,還是你想在第二次使用時使用其值的不同子集?此外,更大的上下文是什麼 - 聽起來你可能想要一個參數類型或類型類,但我不確定沒有上下文。 – 2011-12-16 18:41:28

回答

1

你直接要求什麼,根本無法做到。鑑於

:- type question 
     ---> truth(string, bool) 
     ;  blank(string, string) 
     ;  multiple(string, string, list(string)). 

附加各種各樣的問題只能通過擴展這種類型的定義它,並重新編譯的模塊添加 - 像

answer(truth(_, yes)) = "true". 
answer(truth(_, no)) = "false". 
answer(blank(_, A)) = A. 
answer(multiple(_, A, _)) = A. 
並作出了很多其他的變化,也因爲先前確定的代碼給定新的問題類型時,

會失敗。在編譯時告訴你,你沒有更新你的程序來反映增加一個「選擇正確答案」類型的問題,這是你有一個問題類型的一個很好的部分,而不是說你的問題銀行的字符串列表[["Are foxes pretty?", "true"], ["Green foxes are ____", "adorable!", "fake", "evidence of animal cruelty"]]

你所要求的是無法完成的。然而,你真正想做的事情 - 你認爲'可變數量類型'的結局會是一個有用的手段 - 當然可以用其他方式完成。我不知道這是什麼方式,因爲我不能說出你爲什麼想要從你的問題中解決問題。也許你會從語言參考中的discriminated unionstypeclasses閱讀中受益。

+2

不正確。您可以聲明特定的字符串類型實例,以防止謂詞失敗。例如: - inst foo == bound(「x」;「y」;「z」)。 : - func bar(string :: in(foo))=(int :: out)det。當然這很奇怪,但它會完成OP所要的(我認爲)。 – 2011-12-17 05:28:15

2

正如其他人所說,這是在水星根本不可能的 - 這是故意的。

如果你想表達一種你可能雖然想要什麼,:V1 V2 V3 ...等是:

:- type my_type 
    ----> v(int). 

:- func name(my_type) = string. 

name(v(Num)) = formst("v%d", [i(Num)]). 

類型表示所有整數v和函數名可以用於這種類型的'漂亮'值。

1

據我瞭解這個問題。你需要一些類似Prolog的行爲。 I.e沒有鍵入謂詞。在靜態類型系統中,您總是可以通過自己處理這些行爲來實現這種行爲。很久以前,我在Turbo Prolog中看到過這樣的例子(他們在Turbo/Visual Prolog方面實現了ISO prolog)。

考慮類似的東西(我不知道它是正確的):

:- type any_type ---> atom_value(string) 
       ; number_value(int) 
       ; struct_value(any_type, list(any_type)). 

guess(atom_value("v1")). 
guess(atom_value("a")). 
guess(atom_value("aa")). 
guess(number_value(42)). 
guess(struct_value(atom_value("pair"), [number_value(3), number_value(4)])).