2016-09-16 5 views
1

Я пытаюсь сделать факторный код в прологе, но я получаю ошибку из локального стека, то есть он застревает в бесконечном цикле. Я не понимаю, как это сделать. Вот мой код:Ошибка пролога: из локального стека в факториале

fact(0,1). 
fact(1,1). 

fact(X,Y):- X\==0, A=X-1, fact(A,Z), Y=X*Z. 

Где я буду неправильно?

ответ

2

Это A=X-1, а затем Y=X*Z. Самое замечательное в верхнем уровне Prolog является то, что вы можете легко попробовать, что делает ваш код:

?- A = X-1. 
A = X-1. 

?- A = 5-1. 
A = 5-1. 

Видимо, Пролог издевается :). Для объединения используется оператор =; если вы хотите выполнять арифметические действия, вы должны использовать is/2:

?- is(A, -(5, 1)). 
A = 4. 

обычно записывается как:

?- A is 5-1. 
A = 4. 

Это просто, чтобы показать вам, что это выражение является термином, и оценивает этот термин в секунду аргумент:

?- Expr = X-1, X = 3, Result is Expr. 
Expr = 3-1, 
X = 3, 
Result = 2. 

К вашему определению для factorial: он должен работать, если вы исправите арифметику. Обратите внимание, что было бы чище, если условие для X в начале говорит X > 1 вместо X \== 0: что делает ваша текущая программа для fact(1,F) и сколько ответов вы получаете?

+0

Это работает! Большое спасибо! – telekineser