Это очень часто задаваемый вопрос, но я хотел бы задать его в связи с двумя примерами, которые кажутся мне очень похожими, и все же один правильный, а другой нет.
Правильный пример:
k_th_element(X,[X|_],1).
k_th_element(X,[_|L],K):- K>1,K1 is (K-1),k_th_element(X,L,K1).
Неправильный пример
length2(1,[_]).
length2(X,[_|Ys]) :- X>1, X1 is (X-1), length(X1,Ys).
Почему пролог жалуется или нет для каждого случая?
Обновление: кажется, я понял. Чего я не мог понять, так это того, что неважно, что такое предикат, но как вы его называете. так что это правильно: k_th_element(X,[1,2,3,4,5],3), потому что у вас есть значение для K, которое является правильной переменной оператора «есть». Но при этом k_th_element(3,[1,2,3,4,5],Y) работать не будет, т.к. Y это переменная, наша "цель" и мы не можем иметь ее в правой части " есть" оператор. Поправьте меня если я ошибаюсь.
is/2
и>/2
) ограничения конечной области(#=)/2
и#>/2
. При использовании этих ограничений любые части обеих сторон могут содержать переменные, и вы можете использовать эти предикаты как истинные отношения. - person mat   schedule 06.08.2015X1 #= X0 - 1
. Пожалуйста, используйте:- use_module(library(clpfd)).
для доступа к декларативной целочисленной арифметике в SICStus, SWI и YAP. (В GNU Prolog и B-Prolog он уже доступен с самого начала.) - person mat   schedule 06.08.2015