2013-05-17 2 views
1

вот моя проблема. Я получаю различные списки с переменной подчеркивания в них (например: [_, _, A, _, _] или [_, A, B, _, _]), и мне нужно (в этом случае A или A и B)Как я могу найти список с переменной подчеркивания? (Prolog)

Возможно ли это, или я пытаюсь решить это неправильно.

Для лучшего контекста: Я пытаюсь сделать программу типа Cluedo в Прологе, у вас есть ключи, то вы получите ключи от других игроков и попытаться найти убийца, но я хочу один список для каждый подозреваемый (например, [имя, возраст, оружие, персональный элемент]), так что вы можете видеть каждый раз, когда получаете подсказку, как оружие, я получаю список, подобный этому [_, _, нож, _]

если бы кто-нибудь мог помочь, я был бы признателен

С наилучшими пожеланиями

ответ

2

Способ проверки, свободен ли переменная, - это предикаты ISO var/1 и nonvar/1, которые являются истинными, если их аргумент является свободной переменной или инстанцируется.

Так что, если у вас есть список с некоторыми переменными, связанными, вы можете сказать:

nonvar_member(M, List) :- member(M, List), nonvar(M). 

Этот предикат будет перечислять (унифицировать с М через возвраты) элементами Списка которые не являются свободными переменные:

?- nonvar_member(X, [2,_,_,3,A,1,_]). 
X = 2 ; 
X = 3 ; 
X = 1 ; 
false. 

Но в целом есть много примеров вокруг (также на Stackoverflow) использование Пролога для решения головоломок, основанных на подсказках, так что постарайтесь смотреть на тех, кто первый.

+0

член/2 должен быть достаточным для типичного использования. Использование - и понимание - nonvar/1 поставит OP на сложный трек. – CapelliC

+1

@CapelliC Я должен признать, что я не понимаю ... Можете ли вы уточнить? –

+0

Ваши объяснения звучат, но IMHO nonvar/1 не подходит или даже вводит в заблуждение. – CapelliC

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