Пролог сумма и саб с использованием преемников? - PullRequest
0 голосов
/ 29 апреля 2009

Что такое вычитание и суммирование с использованием наследников, может ли кто-нибудь показать мне пример того, что я знаю, как это сделать обычным способом.

/ * sub (X, Y, Z) --- вычитание * /

sub (X, Y, Z): - добавить (Y, Z, X).

1 Ответ

2 голосов
/ 29 апреля 2009

Для начала нужно иметь предикат succ. Вот как это определяет SWI-Prolog:

succ(?Int1, ?Int2)
    True  if  Int2 = Int1+ 1  and  Int1>=0.     At  least  one  of  the
    arguments must be  instantiated to a natural number.  This predicate
    raises the domain-error not_less_than_zero if called with a negative
    integer.   E.g. succ(X, 0)  fails silently and succ(X, -1) raises  a
    domain-error.

Учитывая это, мы можем определить add следующим образом:

add(0, Y, Y).
add(X, Y, Z) :-
  succ(PredX, X),
  add(PredX, Y, PredZ),
  succ(PredZ, Z).

И subtract вот так:

subtract(X, 0, X).
subtract(X, Y, Z) :-
  succ(PredY, Y),
  succ(PredX, X),
  subtract(PredX, PredY, Z).

Обратите внимание, что ни один из них не будет обрабатывать отрицательные числа (потому что succ нет), и поэтому я не удосужился сделать функцию вычитания, когда Y > X.


EDIT:

Вот версии add и subtract, которые работают с любым шаблоном создания экземпляров. Я все еще не беспокоился о проверке типов (как упомянуто Каарелем в комментариях) или отрицательных числах.

add(0, 0, 0).
add(0, Y, Y).
add(X, 0, X).
add(X, Y, Z) :-
  nonvar(X),
  succ(PredX, X),
  (nonvar(Z) -> 
    succ(PredZ, Z), add(PredX, Y, PredZ) 
  ; 
    add(PredX, Y, PredZ), succ(PredZ, Z)
  ).
add(X, Y, Z) :-
  nonvar(Y),
  add(Y, X, Z).

subtract(0, 0, 0).
subtract(X, 0, X).
subtract(X, X, 0).
subtract(X, Y, Z) :-
  add(Y, Z, X).
...