Пролог. Как вывести решение вроде Да или Нет
Я пытался решить проблему точки, принадлежащей области. В результате мне нужно получить ответ: принадлежит ли точка данной области или нет. Координаты точки, введенные пользователем с клавиатуры. Когда я пытаюсь передать координаты точки непосредственно в правиле: belongsTo (1,1).
Я получаю желаемый результат (да или нет), но при вводе координат с клавиатуры
write ("Input X:"), readreal (X),
write ("Input Y:"), readreal (Y),
belongsTo (X, Y).
Тогда ответом будет "нет решений" или просто "2 решения" (X = 0, Y = 0, X = 0, Y = 0, если вы пройдете точку (0,0))
Вот код полностью:
PREDICATES
square(real,real)
semicircle(real,real)
belongsTo(real,real)
CLAUSES
square(X,Y):-
X>=-1,X<=0,
Y>=-1,Y<=0.
semicircle(X,Y):-
X>=0,Y>=0,
X*X+Y*Y<=1.
belongsTo(X,Y):-
square(X,Y);
semicircle(X,Y),!.
GOAL
write("Input X: "), readreal(X),
write("Input Y: "), readreal(Y),
belongsTo(X,Y).
В результате мне нужно получить решение типа ДА (если точка принадлежит области) или НЕТ.
1 ответ
При использовании метода подсказок:
write("Input X:"), readreal(X),
write("Input Y:"), readreal(Y),
belongsTo(X, Y).
Пролог отобразит значения X
а также Y
вместе с решением (да или нет), потому что эти переменные явно появляются в вашем запросе. Любые переменные в вашем запросе предполагают, что вы хотите видеть результаты. Если вы просто хотите увидеть да или нет, то вы можете сделать предикат:
readuser :-
write("Input X:"), readreal(X),
write("Input Y:"), readreal(Y),
belongsTo(X, Y).
А потом просто запрос readuser
, Тогда вы просто получите да или нет без значений X
а также Y
отображается.
Насколько разные результаты, если вы введете 0
а также 0
за X
а также Y
этот ввод будет выполнен дважды: один раз для semicircle
и один раз для square
, Пролог добросовестно находит оба успешных результата.
Когда вы вводите 1 и 1 и читаете их как "настоящие", я подозреваю, что внутреннее представление становится проблемой с точностью с плавающей запятой и внутренне становится чем-то вроде: 1.000000001
и они потерпят неудачу как semicircle
а также square
тесты.
Помимо этого, semicircle
тестирование на неотрицательные X
и неотрицательный Y
квадрант, а не полукруг. фактический semicircle
проверки будут ограничивать только одну из координат в сочетании с X*X + Y*Y <= 1
например, X >= 0, X*X + Y*Y <= 1
будет верхний правый и нижний правый квадранты полукруга.