Программирование квадратичной формулы на Прологе

Во-первых, я увидел, что этот же вопрос задавали ранее сегодня, и решил попробовать сам (и у меня возникли проблемы с этим). Надеюсь, я создал для этого новый вопрос!

Я пытаюсь написать программу на прологе, которая решает квадратную формулу X = ​(​​−b±√​b​2​​-4ac)​/2a. Реализованный предикат quadratic([A,B,C], [Result]) принимает список a, b и c в качестве первого аргумента и список результатов в качестве второго. Однако списки доставляют мне неприятности; Я написал этот код:

quadratic([A,B,C], [X]):-
  underRoot([A,B,C], UnderRootResult),
    UnderRootResult<0,
      X is 0.
quadratic([A,B,C], [X]):-
  underRoot([A,B,C], UnderRootResult),
    UnderRootResult=:=0,
      X is -B/2*A.
quadratic([A,B,C], [X]):-
  underRoot([A,B,C], UnderRootResult),
    UnderRootResult>0,
      X is -B - sqrt(UnderRootResult)/2*A,
      X is -B + sqrt(UnderRootResult)/2*A.

(Это, вероятно, полно ошибок, так что извините меня заранее) Запуск этого даст мне неопределенную ошибку процедуры для underRoot/2. Я действительно не понимаю, почему это происходит. Я чувствую, что у меня есть общее представление о том, как это запрограммировать, но я делаю много ошибок новичка. Я не могу понять, в чем проблема, поэтому буду признателен за любую помощь!

edit: Кроме того, если мне разрешено задавать два вопроса одновременно, как я могу получить оба X в случае> 0 в списке как один результат?


person Rose    schedule 17.09.2017    source источник
comment
предикаты начинаются со строчной буквы, поэтому UnderRoot, вероятно, неверно?   -  person Willem Van Onsem    schedule 17.09.2017
comment
Я не могу в это поверить. Извините за ТАКУ ошибку.   -  person Rose    schedule 17.09.2017
comment
Вы можете написать X равно -B - sqrt(UnderRootResult)/(2*A) и Y равно -B + sqrt(UnderRootResult)/(2*A), и вы напишите L = [X, Y].   -  person joel76    schedule 17.09.2017


Ответы (1)


Здесь есть много вещей. Во-первых, обычно все вызовы в теле помещаются в один и тот же столбец, но на самом деле это не ошибка.

Кроме того, я не нашел предиката underRoot/2. Мы можем реализовать один из них:

underRoot([A,B,C],X) :-
    X is B*B-4*A*C.

Кроме того, вы всегда ставите [X] в начале предложений. Но в случае, если UnderRoot меньше нуля, решений нет, поэтому список должен быть []. Кроме того, в случае UnderRoot > 0 есть два решения, поэтому решение должно быть [X1,X2].

Наконец, если вы напишете -B/2*A, это будет интерпретировано как: (-B/2)*A, так что вы будете умножать на A. Поэтому вам нужно будет использовать -B/(2*A).

Итак, это подводит нас к следующему предложению:

quadratic(L, []) :-
    underRoot(L, U),
    U < 0.
quadratic([A,B,C], [X]) :-
    underRoot([A,B,C],0),
    X is -B/(2*A).
quadratic([A,B,C], [X1, X2]) :-
    underRoot([A,B,C],U) :-
    SU is sqrt(U),
    X1 is (-B-SU)/(2*A),
    X2 is (-B+SU)/(2*A).
person Willem Van Onsem    schedule 17.09.2017
comment
Да, я заметил, что сделал несколько ошибок в коде, который записал здесь, и понял это самостоятельно. У меня остались проблемы только со вторым предложением, которое каким-то образом дало мне неправильный ответ, поэтому просмотр вашего кода действительно помог, и это также был более эффективный способ его записи. Большое спасибо! - person Rose; 17.09.2017