Формулировка английских операторов как набора операторов логики первого порядка
В настоящее время я изучаю FOL и у меня есть ряд английских утверждений, которые я пытаюсь сформулировать в FOL.
У меня есть английские заявления, а также мои попытки FOL на каждом. Мне просто интересно, есть ли кто-нибудь, кто может сообщить мне, если и где я мог ошибиться с ними, спасибо.
АНГЛИЙСКИЙ ЗАЯВЛЕНИЯ
Высокий мужчина может достать высокий крюк.
Маленький человек может достать низкий крючок.
Высокий крюк свободен.
Человек повесит свое пальто, если есть свободный крючок для одежды, и человек может достать этот крючок для одежды.
Пол высокий человек.
Джон невысокий мужчина.
Кто может повесить свое пальто на каком крючке?
ПЕРВАЯ ЗАКАЗ ЛОГИЧЕСКОГО ЗАЯВЛЕНИЯ
Manx человек (X, высокий) -> досягаемость (X, высокий_крюк).
Manx человек (X, маленький) -> reach_hook(X, low_hook).
бесплатно (high_hook).
∀x, y свободен (X) ^ достать_крюк (Y,X) -> повесить пальто (Y, X).
человек (Paul, высокий).
мужчина (Джон, короткий).
? - повесить пальто (X,Y).
1 ответ
Я предполагаю, что вы имеете в виду Пролог, когда вы говорите FOL. Они не одно и то же.
Общие комментарии: переменные Пролога неявно универсально (все) количественно определены, поэтому вам не нужен квантификатор,, поэтому у Пролога его нет. Экзистенциальный квантификатор записывается X^ как в
X^(man(X), tall(X))
но может использоваться только в телах предикатов. Если вы хотите сказать что-то вроде "есть высокий человек", вам нужно использовать атом, чтобы представить его, как в
tall(xyzzy001).
man(xyzzy001).
Итак, ваши примеры. В #1 и #2 и человек, и крючок четко определены количественно, но вы используете атом для крючка (или двух крючков). Также man/2
а также reach_hook/1
кажется, ad-hoc. У всех мужчин есть только одно свойство? Что такого особенного в достижении крючков, в отличие от полок, выступов, дверных ручек... Возможно, что-то вроде следующего может быть лучше.
reach(X,Y) :- man(X), tall(X), hook(Y), high(Y).
reach(X,Y) :- man(X), small(X), hook(Y), low(Y).
(Изменено, чтобы сделать его действительным синтаксисом.)
В #3 вы соответственно используете атом, но чтобы сохранить его в соответствии с предыдущими предложениями, мы могли бы вместо этого сказать
hook(xyzzy002).
high(xyzzy002).
free(xyzzy002).
Примеры № 5 и № 6 похожи. В #4 вы, кажется, упростили определение крючка как "вешалки", что, вероятно, не важно, и ваши предикаты могут быть более общими, например
hang(X,Z,Y) :- man(X), hook(Y), coat(Z), reach(X,Y), free(Y).
(Изменено, чтобы сделать его действительным синтаксисом.)
И, предполагая эту формализацию и заполненную базу данных, вопрос № 7 можно сформулировать как
?- hang(X,Z,Y), coat(Z), owns(X,Z).
А также owns/2
вероятно, должен быть включен в № 4 также.