2013-10-09 36 views
1

我想知道是否有一種方法來「捷徑」序言中的列表聲明。而不是 [1,2,3]。我想myList = [1,2,3]。這樣我就可以嘗試使用myList(比如成員(X,myList)),而不必一遍又一遍地重複實際的列表,這是可能的嗎?我沒有在google上找到任何東西還告訴我,它可能不是,但你永遠不知道謝謝我想知道序言列表

+0

你應該接受dasblinkenlight的回答,從未回答的清單中清除這個問題,並給他他的道具。 ;) –

回答

2

可以代替上述聲明,使用常規的Prolog的「事實」,像這樣:。

myList([1, 2, 3]). 

現在你可以使用這個事實如此:

someRule :- 
    myList(L), /* Unify L with the list from myList fact */ 
    member(X, L), /* Use L, which is now the [1, 2, 3] list */ 
    ... 

這種方法可以避免硬編碼列表t帽子需要在你的程序中的幾個地方使用。

子句中
+0

非常感謝你,這正是我正在尋找的! –

+1

@JoshAlcorn不客氣!如果答案適用於您的情況,請考慮單擊旁邊的複選標記以接受該答案。這會向其他訪問者表明您不再主動尋找改進的解決方案,併爲堆棧溢出獲得新徽章。 – dasblinkenlight

2

,只使用一個可變(即一個符號開始大寫)統一列出字面

some_rule(Z) :- 
    X = [1,2,3], Y = [4,5,6], 
    append(X, Y, Z), 
    forall(member(M, X), writeln(M)). 

否則,共享多個子句中的列表,dasblinkelight」暗示去。

0

如果有人需要一個例子,這裏是我用來測試這個代碼,它的工作原理。

:- dynamic my_spell_is/1. 
my_spell_is(none). 

spellslist([fire,ice,lightning,heal]). 

casting :- 
    my_spell_is(X), 
    write('Current spell: '), write(X), nl. 

isspell(X) :- (validSpell(X) -> 
my_spell_is(Y), 
retract(my_spell_is(Y)), 
assert(my_spell_is(X)) ; 
write(X), write(' is not a valid spell.'), nl). 

validSpell(X) :- 
    spellslist(L), /* Unify L with the list from spellslist fact */ 
    member(X, L). /* Use L, which is now the [fire,ice,lightning,heal] list */ 
+0

感謝您編輯我的代碼。我對這個網站並不是特別熟悉,或者它的工作原理,我對張貼草率的代碼表示歉意。 –

+0

沒問題!要格式化代碼,請選擇要格式化的行,然後單擊編輯器頂部的'[{}]'按鈕。您也可以在代碼塊前添加四個空格以使其格式化,或者在問題內部使用反向引號代替內聯代碼。 – dasblinkenlight