Разрешение аксиомы
Я пытаюсь понять, как разрешение аксиомы работает в прологе.
Предположим, что я определяю две основные операции над натуральными числами:-
S (термин) (обозначает преемника) и
-
Добавить (термин, еще один термин).
Семантика add задается через
-
Добавить (0, x1) - > x1
-
Добавить (x1, 0) - > x1
Добавить (s (x1), y1) - > s (добавить (x1, y1))
Тогда я хотел бы решить уравнение
Add (x, add (y, z)) = s (0)
Я полагаю, что одной из стратегий может быть
-
Проверить, если правая сторона (RHS) уравнения равна его левой стороне (LHS)
-
Если нет, посмотрите, можно ли найти решение, ища наиболее общий объединитель
-
Если нет, то попробуйте найти аксиому, которая может быть использована в этом уравнении. Стратегия выполнения этой работы может заключаться в следующем (для каждой аксиомы): попробуйте решить RH уравнения равны к РХС аксиомы. Если есть решение, то попробуйте решить LHS уравнения, равного LHS аксиомы. Если это удастся, то мы нашли правильную аксиому.
-
В конечном счете, если нет решения и LHS и RHS уравнения являются одной и той же операцией (т. е. одна и та же сигнатура, но не одни и те же операнды), примените алгоритм к каждому операнду, и решение будет найдено, если решение найдено для каждого операнда.
Я думаю, что этот (простой) алгоритм может работа. Однако я хотел бы знать, есть ли у кого-нибудь опыт решения такого рода проблем? Кто-нибудь знает, где я могу найти документацию о лучшем алгоритме?
Заранее спасибо
3 ответа:
Пролог-это набор предикатов.
Предикат - это набор предложений.Предложение имеет вид
Head :- Body.Означает "
Headистинно, еслиBodyистинно".Существует сокращенная форма предложения
Head.Что означает то же самое, что и
Head :- true.Где
Возвращаясь к части предложенияtrue- построенное, которое всегда истинно.Body,Bodyявляется целью, которая может принимать одну из следующих форм:(A,B, и ещеCобозначим произвольные цели):Atom % This is true if Atom is true (see below). A, B % This is true if A is true and B is true. (A ; B) % This is true if A is true or B is true. \+ A % This is true if A is not true. (A -> B ; C) % If A is true then B must be true, else C must be true.В прологе есть некоторые специальные правила, касающиеся порядка оценки (слева направо) и" сокращений " (которые обрезают дерево поиска), но это мелкие детали, которые выходят за рамки этого краткого руководства.
Теперь, чтобы решить, является лиAtomистинным,Atomможет быть одной из следующих форм (XиYобозначают произвольные термины):Термин-это, по существу, любой фрагмент синтаксиса.true % or some other builtin with given truth rules. X = Y % True if X and Y are successfully unified. p(X, Y, ...) % True if p(X, Y, ...) matches the head of some clause % and the Body is true.Ключевая вещь, которую нужно заметить здесь, это этот пролог не имеет никаких функций! Если в функциональном языке вы можете определить функцию
Учитывая все это, мы можем определить ваши правила в прологе следующим образом:add(X, Y), которая вычисляется как суммаXиY, то в прологе вы определяете предикат, головкой которого являетсяadd(X, Y, Z), который, если это удается, объединяетZс термином, обозначающим суммуXиY.add(0, Y, Y). % 0 + Y = Y. add(Y, 0, Y). % Y + 0 = Y. add(s(X), Y, s(Z)) :- add(X, Y, Z). % s(X) + Y = s(X + Y).Где я использую
0для обозначения нуля (!) иs(X)для обозначения преемникаX.Рассмотрим оценка
add(s(s(0)), s(0), Z):add(s(s(0)), s(0), Z) % Only the third head for add matches, so... ---> Z = s(Z0), add(s(0), s(0), Z0). add(s(0), s(0), Z0) % Only the third head for add matches, so... ---> Z0 = s(Z1), add(0, s(0), Z1). add(0, s(0), Z1) % Only the first head for add matches, so... ---> Z1 = s(0).Собирая все эти объединения для
Zвместе, мы имеемZ = s(s(s(0))).Теперь вы можете спросить :" что произойдет, если в предложении совпадет более одной головы?" или "что произойдет, если путь оценки завершится неудачей?", на которые даны ответы "недетерминизм", "отступление" и, вообще, читай учебник пролога!
Надеюсь, что это помогает.