Я знаю, что у Prolog есть свой предикат для обработки наследников, но я хочу сделать свой собственный для упражнений.Реализация моего предиката преемника
Вот код моего текущего положительного преемника:
successor(0,1).
successor(X,Y) :-
X > 0,
Xx is X-1;
successor(Xx,Yx),
Y is Yx + 1.
Когда я типа successor(O,1)
, У меня есть true
successor(O,X)
возвращается X = 1
successor(X,1)
возвращает X = 0
successor(2,X)
возвращает X = 3
Последнее, что мне не удастся делать это
successor(X,2)
Он бросает и ошибка:
ERROR: >/2: Arguments are not sufficiently instantiated
Я сделал свой след, и выяснил, что это сравнение неинициализированный переменной (X
) для 0
Это потому, что я прошу об этом, но я не знаю, как исправить это, чтобы последний вызов работал, и все еще есть и другая работа.
У вас возникнут проблемы с '>/2' и' is/2' при создании реляционного преемника-преемника/2'. '>/2' ожидает * оба * аргументы должны быть созданы. Поэтому, если 'X' является переменной,' X> 2' выдаст ошибку. Предикат 'is/2' ожидает, что все с правой стороны будет создано.Таким образом, даже если 'X> 2' работал,' Xx is X-1' будет вызывать ошибку, если 'X' является переменной, потому что ему нужно вычислить выражение справа от' is'. Пути вокруг него (clunky): используйте 'var/1' или' nonvar/1' для проверки переменных или (лучше): используйте операции CLPFD, такие как 'X #> 0' и' Xx # = X - 1 '. – lurker
Кроме того, нет необходимости, чтобы 'successor/2' был рекурсивным, если вы не ищете все' Y', такие как 'X
lurker
В качестве первого шага при изучении Prolog сосредоточьтесь на [тег: преемник -arithmetics]. Вы используете '(is)/2' и' (>)/2', который слишком моден для ваших первых попыток. – false