2014-02-03 2 views
1

Я пытаюсь написать программу Prolog с правилом good, который берет список, где каждый термин в списке является числом Peano. Правило должно быть истинным тогда и только тогда, когда каждый элемент в списке больше предыдущего.Программа Prolog - список чисел Peano - правило возвращает несколько ответов

Например, следующие примеры должны быть правдой:

good([]). 
good([0]). 
good([0,s(0)]). 
good([0,s(s(0))]). 
good([0,s(0),s(s(0))]). 

И следующие примеры должны быть ложными:

good([s(0),0]). 
good([0,s(0),0]). 

Вот мой код:

plus(X,0,X). 
plus(X,s(Y),s(Z)) :- plus(X,Y,Z). 

geq(X,Y) :- plus(K,Y,X). 
ge(X,Y) :- geq(X,Y), not(X = Y). 

good([]). 
good([X]). 
good([H|T]) :- good(H,T). 
good(X,[H|T]) :- ge(H,X), good(T). 

Однако, для положительного запроса good([0,s(0),s(s(0))]), как true, так и false являются решениями.

Какая ошибка?

+0

Альтернативное решение: 'good (L): - msort (L, L) .' – ssBarBee

+0

@ssBarBee:' msort/2' следует заменить на 'sort/2'. Элементы должны быть только выше. – false

ответ

1

См. this answer. Сначала получая true, а затем получая false после обратного отсчета, просто означает, что он нашел ответ, затем по вашему запросу попробовал другой путь, а затем не смог найти другой путь для достижения true, поэтому вернулся false.

Другими словами, как говорит, что ответивший,

false реакция может оказаться несовместимым с началом программистов на Прологе и «чувствовать», как ошибки или предупреждения, но на самом деле это совершенно нормальная реакция Пролог.

Смежные вопросы