prolog - 将 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)))
现在我不知道如何在 Prolog 中编写它们。
另外,我怎样才能对它们进行查询?
解决方案
- 所有的猎犬都在夜间嚎叫。
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).
推荐阅读
- google-apps-script - 需要帮助以使用“Google 脚本”中的 ContactsApp 功能提取“电子邮件 ID”
- c# - 在 C# 中显示来自 CRM 的 5000 多条记录
- android - 使用签名的 apk 升级时未安装应用程序
- arrays - 用于 Numpy 对象数组的 Pycharm 类型提示
- python - 如何从另一个数组的值中获取一个 numpy 数组(Python)
- node.js - 我无法在 Angular 中使用 emailjs 发送电子邮件
- javascript - 无法在未安装的组件主题提供程序上执行 React 状态更新
- cucumber - 按空手道示例表的行号过滤场景大纲
- wpf - IdownloadHandler 在 WPF Cefsharp 浏览器中不起作用
- python - 如何将结果从注释收集到数组中?