2012-03-24 3 views
2

Я проковылял в течение 3 часов в настоящее время по этой проблеме, мне нужно найти индекс (A,B,C) где A является позицией индексных B в списке C (или -1, если нет в списке) , Это то, что я до сих пор,Prolog- обратного индексу элемента

indexof(A,0,[A|_]). 
indexof(A,B,[_|C]):- Y is B-1, indexof(A,Y,C). 

это дает элемент на указательном месте B, который не то, что я хочу.

indexof(A,1,[1]). 

должен вернуть A=0;A=-1.

Я ужасно на Прологе, я сделал Java всю свою жизнь, поэтому, пожалуйста, также давать объяснения.

+0

Можете ли вы привести пример вызова со значениями для '' b' и C', и ожидаемое значение 'A'? (Правильно ли я понял ваш вопрос?) – sarnold

+0

Прошу прощения, мне трудно сформулировать свой вопрос, мой мозг жарится. В основном, индекс (A, 1, [1]). должен возвращать A = 0; A = -1. Как вы можете сказать из моего очень продвинутого кода * sarcasm *, я совершенно не понимаю, как это сделать на этом языке. – MellowFellow

+0

Не шутите, Пролог занимает некоторое время, чтобы привыкнуть. (Я, конечно, еще не получил его.) – sarnold

ответ

3

Вы можете использовать встроенный предикат nth1/3, который можно использовать непосредственно для достижения того, что вы хотите.

indexof(Index, Item, List):- 
    nth1(Index, List, Item). 
indexof(-1, _, _). 

[редактировать после ОП перефразировать вопрос]

Первый пункт перечисляет индекс элемента в списке, а второй пункт только объединяющую индекс с -1 в соответствии с требованием ОП.

+0

Я пытался выяснить, что именно делает nth1/3, можете ли вы, пожалуйста, помочь мне понять? Спасибо за помощь! – MellowFellow

+0

Проверьте [this] (http://stackoverflow.com/questions/4237697/simple-nth1-predicate-in-prolog) вопрос, который описывает, как работает 'nth1/3'. – gusbro

+0

Спасибо, человек! Я, наконец, думаю, что понимаю, по крайней мере, я понимаю эту небольшую часть. – MellowFellow

1

Попробуйте следующее

indexof(A,0,[A|_]). 
indexof(_,-1,[]). 
indexof(A,D,[_|C]):- indexof(A,B,C), B > -1, D is B+1. 
indexof(A,D,[_|C]):- indexof(A,B,C), B = -1, D is B. 

Вам необходимо иметь базовый случай для [] и логику приращения для -1 а

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