Как написать Пролог - определение базовых c операторов? - PullRequest
0 голосов
/ 14 марта 2020

Я довольно новичок в Прологе и хочу создать предикат, который будет вести себя следующим образом

calculate(add(1, sub(4,1)),Result).
Result = 4.

Это делает: 1 + (4 - 1) = 4

Я знаком с предикатами, но не знаю, с чего начать с точки зрения возможности написания предиката / оператора добавления // 2.

Любая помощь или предложения приветствуются.

Ответы [ 2 ]

2 голосов
/ 14 марта 2020

С небольшими изменениями в представлении чисел мы можем написать хорошее решение. Изменение должно представлять число N как число (N) `, чтобы избежать представления по умолчанию (что означает« это число по умолчанию, если это не операция):

calculate(number(Number), Number).
calculate(add(Expression1, Expression2), Result) :-
    calculate(Expression1, Result1),
    calculate(Expression2, Result2),
    Result is Result1 + Result2.
calculate(sub(Expression1, Expression2), Result) :-
    calculate(Expression1, Result1),
    calculate(Expression2, Result2),
    Result is Result1 - Result2.

Пример звонка:

| ?- calculate(add(number(1), sub(number(4), number(1))), Result).

Result = 4
yes
2 голосов
/ 14 марта 2020

Вы все еще думаете о функциях

z = f(x,y): "f (x, y) возвращает (заменяется на / сокращается до) значение z ..."

Предикаты связывают значения с другими значениями:

p_f(x,y,z): "предикат p_ создает значения отношения / соединения / связей (x, y, z) такой, что z = f (x, y) "

Таким образом, к оценке конвейера (математическая запись (g ° f) (x, y) )

g(f(x,y))

Вы должны написать (не принимая во внимание соглашение Пролога, что здесь «переменные» пишутся в верхнем регистре):

p_f(x,y,a),p_g(a,b)

И думать с точки зрения информация, поступающая в это выражение через p_f(x,y,_), передаваемая в p_g/2 через p_f(_,_,a), p_g(a,_) и вытекающая из выражения через p_g(a,b).

И p_f / 3 или p_g / 2 прекратит сбой (вернет false, не в любом из своих аргументов, но в целом), если они не смогут связать свои аргументы и результата не будет.

Использование предикатов имеет объявление что для p_f (x, y) вы можете запросить x , если известно y , y , если x известно, или пары действительных (x, y) (при условии, что это возможно в вычислительном отношении, и предикат был правильно закодирован). Или для предиката add/3:

  • add (2,3, X) -> X = 5
  • add (2,3,5) -> true
  • add (X, 3,5) -> X = 2
  • add (1,3,5) -> false
  • add (X, Y, 5) -> X = 2, Y = 3; Х = 3, Y = 2; ... до бесконечности
  • добавить (X, Y, Z) -> то же, что и выше, только еще более безудержно

См. также: Пролог ~ Разделение числа в список

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...