Пролог. Как вывести решение вроде Да или Нет

Я пытался решить проблему точки, принадлежащей области. В результате мне нужно получить ответ: принадлежит ли точка данной области или нет. Координаты точки, введенные пользователем с клавиатуры. Когда я пытаюсь передать координаты точки непосредственно в правиле: 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 будет верхний правый и нижний правый квадранты полукруга.

Другие вопросы по тегам