Как найти n-й элемент списка и получить ответ в R PROLOG

Очень новичок в прологе. Я пытаюсь создать простое рекурсивное правило для поиска n-го элемента в списке. Например, если у меня есть список строк или чисел, я хочу использовать запрос

?- findme([dog, cat , bird], 1, R). 
R = dog 
?- findme([9,8,7,6,5], 3,R). 
R= 7
?- findme([mouse,cheese,cat,milk], 5, R).
R = false

Я не хочу не использовать встроенный Nth0, а также иметь R такой, что R равно n -1


person Mohammad Arshad    schedule 04.12.2016    source источник


Ответы (2)


Вот моя реализация:

find([],N,false):-N>0.    
find([H|_],1,H).   
find([_|T],N,R) :- N1 is N-1, find(T,N1,R).

Некоторые примеры:

?- find([dog, cat , bird], 1, R).
R = dog ;
false.

?- find([mouse,cheese,cat,milk], 5, R).
R = false.

?- find([9,8,7,6,5], 3,R).
R = 7 ;
false.
person coder    schedule 04.12.2016
comment
Я предполагаю, что вместо использования find([],1,false). вам следует использовать find([],N,false)., потому что, если вы запустите find([], 3, R)., он не вернет R = false. поправьте меня, если я ошибаюсь. - person Wasi Ahmad; 05.12.2016
comment
Да, конечно, это то, что я сделал в первую очередь, но я проверил с помощью find([],1,false). так и работал, так и оставил. Большое спасибо!!! - person coder; 05.12.2016

Следующее дает ожидаемый результат.

find([],N) :- write("There is no such element in the list"), nl.    
find([Element|List],1) :- write("The element is ", Element), nl.   
find([Element|List],N) :- N1 = N-1, find(List,N1).

Выход :

find([1,2,3,4],3)
The element is 3
Yes

find([1,2,3,4],0)
There is no such element in the list
Yes

find([1,2,3,4],5)
There is no such element in the list
Yes

find([1,2,4,3],4)
The element is 3
Yes

Обновлять

find([],N,false) :- N>0.
find([Element|List],1,Element).   
find([Element|List],N,R) :- N1 = N-1, find(List,N1,R).
person Wasi Ahmad    schedule 04.12.2016
comment
Я смотрел на этот пример. Однако это не печатает R. Например, я запускаю element_at([9,8,7,5,5], 3, R), это просто дает мне false - person Mohammad Arshad; 05.12.2016
comment
но вы упомянули в своем посте, что findme([9,8,7,6,5], 3,R). дает вам R = 7. тогда в чем проблема? на самом деле я не могу запустить код и проверить сейчас на своем ноутбуке. - person Wasi Ahmad; 05.12.2016
comment
На самом деле @Wasi Я хотел бы создать правило, которое даст мне R = 7. Я пробовал что-то похожее на ваше редактирование. Все еще дает мне ложь. Если я что-то изменю, он выведет результат для значения n -1. Например, findme([9, 8. 7, 5, 5], 3, R) я получу R = 8. Не то, что я ищу. Я хочу R = 7. - person Mohammad Arshad; 05.12.2016
comment
Спасибо за обновление. Я тоже пытался обойти этот пример. Я не хочу использовать функцию записи и хотел бы, чтобы мой запрос был в формате (список, N-й термин, R) - person Mohammad Arshad; 05.12.2016
comment
@MohammadArshad, я добавил обновление к своему ответу. надеюсь, что это поможет вам. - person Wasi Ahmad; 05.12.2016