Конвертировать предложения FOL в PROLOG
Я очень новичок в PROLOG, поэтому это может быть очень тривиальный вопрос, но я абсолютно не знаю, как его решить. Мне нужно сформулировать 4 предложения в коде PROLOG:
Все собаки воют ночью.
У любого, у кого есть кошки, не будет мышей.
У легких спящих нет ничего, что воет ночью.
У Джона есть либо кошка, либо гончая.
Я преобразовываю предложения в правильно сформированную формулу в исчислении предикатов первого порядка, как это
- ∀x (HOUND(x) → HOWL(x))
- ∀x ∀y (HAVE(x,y) ∧ CAT (y) → ¬∃z (HAVE(x,z) ∧ MOUSE (z)))
- ∀x (Light_Sleeper(x) → ¬∃y (HAVE (x,y) ∧ HOWL(y)))
- ∃x (HAVE (John,x) ∧ (CAT(x) ∨ HOUND(x)))
Теперь я не знаю, как написать их в прологе.
Кроме того, как я могу сделать запрос на них?
1 ответ
- Все собаки воют ночью.
hound(marshall).
hound(rubble).
howls_at_night(X) :-
hound(X).
%% ?- howls_at_night(everest).
%% false.
%% ?- howls_at_night(rubble).
%% true.
%% ?- howls_at_night(Name).
%% Name = marshall
%% Name = rubble.
- У любого, у кого есть кошки, не будет мышей.
cat(tom).
mice(jerry).
has(mammy, tom).
wont_have_mice(X) :- has(X, Y), cat(Y).
may_have_mice(X) :- has(X, Y) -> \+ cat(Y) ; true.
%% ?- may_have_mice(john).
%% true.
%% ?- wont_have_mice(john).
%% false.
%% ?- wont_have_mice(mammy).
%% true.
%% ?- may_have_mice(mammy).
%% false.
- У легких спящих нет ничего, что воет ночью.
has(ryder, marshall).
has(ryder, rubble).
could_be_a_lightsleeper(X) :- has(X, Y) -> \+ howls_at_night(Y) ; true.
is_not_a_lightsleeper(X) :- has(X, Y), howls_at_night(Y).
%% ?- could_be_a_lightsleeper(max).
%% true.
%% ?- could_be_a_lightsleeper(ryder).
%% false.
%% ?- could_be_a_lightsleeper(Name).
%% Name = mammy.
%% ?- is_not_a_lightsleeper(max).
%% false.
%% ?- is_not_a_lightsleeper(mammy).
%% false.
%% ?- is_not_a_lightsleeper(max).
%% false.
%% ?- is_not_a_lightsleeper(Name).
%% Name = ryder.
- У Джона есть либо кошка, либо гончая.
has_cat_or_hound(X, Y) :- has(X, Y), (cat(Y) ; hound(Y)).
john_has(Y) :- cat(Y) ; hound(Y).