2013-10-09 5 views
1

Мне интересно, есть ли способ «сократить» объявление списка в прологе. Вместо [1,2,3]. Я хотел бы myList = [1,2,3]. так что я могу попытаться использовать myList (например, member (X, myList) вместо того, чтобы повторять фактический список по всем местам, в которых я нуждаюсь. Возможно ли это? Тот факт, что я ничего не нашел в google еще говорит мне, что это, вероятно, нет, но вы никогда не знаете СпасибоМне интересно о списках пролога

+0

Вы должны принять ответ dasblinkenlight, чтобы убрать этот вопрос из списка без ответа и дать ему свои реквизиты. ;) –

ответ

2

вы можете использовать обычный Пролог «факт» вместо такого заявления, как это:..

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 Добро пожаловать! Если ответ подходит для вашей ситуации, подумайте о том, чтобы принять его, нажав галочку рядом с ним. Это указывает другим посетителям, что вы больше не активно ищете улучшенное решение и получаете новый значок в Stack Overflow. – dasblinkenlight

2

в предложении, просто использовать Variable (т.е. символа, начиная в верхнем регистре) объединены в список буквальным

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

Смежные вопросы