Вы постоянно используете выражение 2*X+Y
. Почему бы не вычислить его сначала, а затем использовать этот результат для реальных вычислений? Может быть, вы что-то упустили в постановке задачи?
Почему вы хотите исключить случай, когда X
, Y
и N
равны 0? ... при этом вы не исключаете случай N < 0
?
порядок аргументов
В Прологе принято помещать результаты после соответствующих входных аргументов. Есть исключения из этого правила, (is)/2
— самый распространенный пример, но он записывается как инфиксный оператор.
Сигнализация ошибки
Для случаев, которые вы не можете правильно обработать, в Прологе есть два варианта. Либо вы молча терпите неудачу, либо выдаете чистую ошибку. (Есть третий цикл, который, хотя и не идеален, все же лучше, чем успех.) В настоящее время вы пишете текст, а затем вам это удается. Таким образом, вы предполагаете, что кто-то прочитает ваше сообщение. Но часто программы запускаются без присмотра, и сообщение игнорируется.
Представьте, что я хочу использовать ваше определение, чтобы доказать, что ваше определение — это вопрос, на который следует ответ:
?- expbar(42, 0, 0, 0).
Вот что я получаю в SWI после перезаписи X =:= Y =:= N =:= 0
в X =:= 0, Y =:= 0, N =:= 0
.
?- expbar(42, 0, 0, 0).
[78,111,32,116,119,111,32,118,97,114,105,97,98,108,101,115,32,99,97,110,32,101,113,117,97,108,32,48,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,46]
true.
Там написано true.
! И эти цифры выше, безусловно, являются некоторыми сообщениями о прогрессе в таком очень сложном вычислении... Так что очень легко неправильно понять ваше сообщение. Было бы немного проще, если бы вы использовали одинарные кавычки. Подробнее об одинарных и двойных кавычках. Но даже с более читаемым сообщением его легко пропустить.
Правильный способ справиться с такой ситуацией — выдать ошибку:
throw(error(Error_term,_More_info))
Таким образом, вычисление прерывается, и ошибка обрабатывается на верхнем уровне (или в следующем месте, где ее обрабатывает catch/3
). Это снижает вероятность неправильной интерпретации ошибки.
В идеале Error_term
должен быть одним из существующих условий ошибки. Вот полный список ошибок в ISO Prolog . В вашем случае это может быть evaluation_error(undefined)
аналогично определению возведение в степень.
person
false
schedule
22.04.2012