将FOL子句转换为PROLOG

将FOL子句转换为PROLOG,prolog,first-order-logic,Prolog,First Order Logic,我对PROLOG非常陌生,所以这可能是一个非常琐碎的问题,但我绝对没有 我想知道如何解决它。 有4句话我需要用PROLOG代码表达: 所有的猎犬都在夜间嚎叫 任何有猫的人都不会有老鼠 轻度睡眠者没有任何东西在夜间嚎叫 约翰不是养猫就是养猎犬 我把句子转换成一阶谓词演算中格式良好的公式,就像这样 - ∀x (HOUND(x) → HOWL(x)) - ∀x ∀y (HAVE(x,y) ∧ CAT (y) → ¬∃z (HAVE(x,z) ∧ MOUSE (z))) - ∀x (Li

我对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)))
现在我不知道如何用Prolog编写它们。
另外,我如何对它们进行查询

  • 所有的猎犬都在夜间嚎叫
  • 任何有猫的人都不会有老鼠
  • 轻度睡眠者没有任何东西在夜间嚎叫
  • 约翰不是养猫就是养猎犬

第一个子句已经是Horn子句,您可以直接翻译它。您可以使用常量,而不是使用谓词来表示cat/mouse/等。第二条将成为
∀x(Have(x,cat)→ 有(x,鼠标))
,但它仍然不是Horn条款。它可以表示为查询
∀x(有(x,猫)∧ 有(x,鼠标))
但这需要否定。由于Prolog只实现,所以只要
Have(x,y)
只有有限多个解,翻译就正确。第四条的措辞表明John有猫或狗,但不是两者都有。如果是这样的话,那么您需要明确这一点。
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).