пролог рассматривает вызов функции как определение структуры - PullRequest
0 голосов
/ 11 мая 2018

У меня есть задание для определения базовой арифметики как приращений нуля (т. Е. add(inc(inc(inc(zero))),inc(inc(zero)),Z) дает Z = inc(inc(inc(inc(inc(zero)))))).

add реализован как

add(zero, Y, Z) :- Z = Y.
add(inc(X), Y, Z) :- add(X, Y, V), Z = inc(V).

и я пытаюсь реализовать мул как

mul(zero, Y, Z) :- Z = zero.
mul(inc(zero), Y, Z) :- Z = Y.
mul(inc(X), Y, Z) :- mul(X,Y,V), Z = add(Y,Y,Z).

но это трактует add(Y,Y,Z) как определение структуры вместо предиката add и просто возвращает что-то вроде add(add(inc(inc(zero)), inc(zero)), add(inc(zero),(inc(zero)))
Кто-нибудь знает, как заставить его рассматривать добавить как предикат?

1 Ответ

0 голосов
/ 11 мая 2018

Да.Не глядя на специфику вашего кода, в общем случае просто используйте it:

mul(inc(X), Y, Z) :- mul(X,Y,V), add(Y,Y,Z).

Если это выражает (x+1)*y=z как x*y+y=z, это должно было быть

mul(inc(X), Y, Z) :- mul(X,Y,V), add(V,Y,Z).

вместо.Без обратного отслеживания Prolog во многом похож на функциональный язык с одним присваиванием с кодом в A-нормальной форме, где все промежуточные значения имеют явное имя.

Объединение Z = add(Y,Y,Z) действительно обрабатывает оба своих аргумента как термины Prolog.Один - логическая переменная, другой - составной термин.

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