Prolog中事实数据库的复合查询

Prolog中事实数据库的复合查询,prolog,Prolog,序言新手在这里。我想知道。 如果我有以下谓词: 住在(人、地方)。 他有一辆车(一个人) 这是事实的实际数据库: lives_in( julie, canterbury). lives_in( pete, darwin). lives_in( chris, eliot). lives_in( samantha, darwin). lives_in( james, whitstable). lives_in( john, keynes). lives_in( sue, canterbury). l

序言新手在这里。我想知道。 如果我有以下谓词:

住在(人、地方)。 他有一辆车(一个人)

这是事实的实际数据库:

lives_in( julie, canterbury).
lives_in( pete, darwin).
lives_in( chris, eliot).
lives_in( samantha, darwin).
lives_in( james, whitstable).
lives_in( john, keynes).
lives_in( sue, canterbury).
lives_in( 'mary jane', darwin).
lives_in( rachael, sturry).
lives_in( brad, keynes).
lives_in( keith, whitstable).

% has_a_car( Person)
% ------------------
has_a_car( pete).
has_a_car( samantha).
has_a_car( james).
has_a_car( brad).
我想提出一个问题,告诉我生活在达尔文或凯恩斯并有车的人

为什么我的问题是:

lives_in(X,darwin);lives_in(X,keynes),has_a_car(X).
不工作?这个问题给了我“玛丽·简”,她住在达尔文,但没有汽车。难道X不需要与达尔文或凯恩斯统一,然后拥有一辆汽车吗

提前感谢您

您需要仔细阅读运算符优先级和关联性

/2
(逻辑或)与
,/2
(逻辑与)具有不同的优先级。这意味着你的表达方式与你想象的不一样。像这样的表情

A ; B , C
if ( A || B && C ) ...
可以绑定为

  • (A;B),C
  • A;(B、C)
绑定由操作符优先级和结合性控制。根据你的问题陈述,“这个查询给了我住在达尔文但没有车的‘玛丽·简’”,你认为你得到了哪种约束

尝试使用括号来明确你的意图。更好的是,不要使用“/2'. 说这样的话:

has_a_car(X) , lives_in(X,City) , member(City,[darwin,keynes]).
应该注意的是,在除prolog之外的大多数语言中,您也会遇到同样的问题。例如,C/C++/C#/Java等

A ; B , C
if ( A || B && C ) ...
将有完全相同的问题。

您需要了解运算符优先级和关联性

/2
(逻辑或)与
,/2
(逻辑与)具有不同的优先级。这意味着你的表达方式与你想象的不一样。像这样的表情

A ; B , C
if ( A || B && C ) ...
可以绑定为

  • (A;B),C
  • A;(B、C)
绑定由操作符优先级和结合性控制。根据你的问题陈述,“这个查询给了我住在达尔文但没有车的‘玛丽·简’”,你认为你得到了哪种约束

尝试使用括号来明确你的意图。更好的是,不要使用“/2'. 说这样的话:

has_a_car(X) , lives_in(X,City) , member(City,[darwin,keynes]).
应该注意的是,在除prolog之外的大多数语言中,您也会遇到同样的问题。例如,C/C++/C#/Java等

A ; B , C
if ( A || B && C ) ...
将有完全相同的问题。

您的查询应该是:

lives_in(X):- lives_in(X,darwin), has_a_car(X); lives_in(X,keynes), has_a_car(X).
此查询意味着:

住在达尔文的X有一辆车,或者住在凯恩斯的X有一辆车

t此查询的结果为:

3 ?- lives_in(X).
X = pete ;
X = samantha ;
X = brad.
就像我们想的那样

你的问题

lives_in(X,darwin);lives_in(X,keynes),has_a_car(X).
指:

住在达尔文的X或住在凯恩斯的X有一辆车

而不是

(X住在达尔文或凯恩斯)X有一辆汽车

我能理解你为什么犯这个错误。此查询将是:

lives_in(X):- (lives_in(X,darwin); lives_in(X,keynes)), has_a_car(X).
你必须加上一对括号

在Prolog中,当您编写
,这就像说
。逗号(
)表示

还有一个小提示:如果两个谓词同名(
lives\u in
),那么您可能会混淆,因此可以重命名其中一个谓词。

您的查询应该是:

lives_in(X):- lives_in(X,darwin), has_a_car(X); lives_in(X,keynes), has_a_car(X).
此查询意味着:

住在达尔文的X有一辆车,或者住在凯恩斯的X有一辆车

t此查询的结果为:

3 ?- lives_in(X).
X = pete ;
X = samantha ;
X = brad.
就像我们想的那样

你的问题

lives_in(X,darwin);lives_in(X,keynes),has_a_car(X).
指:

住在达尔文的X或住在凯恩斯的X有一辆车

而不是

(X住在达尔文或凯恩斯)X有一辆汽车

我能理解你为什么犯这个错误。此查询将是:

lives_in(X):- (lives_in(X,darwin); lives_in(X,keynes)), has_a_car(X).
你必须加上一对括号

在Prolog中,当您编写
,这就像说
。逗号(
)表示


Αlso,一个小提示:两个谓词同名(
lives_in
)可能会让人困惑,因此您可以重命名其中一个谓词。

谢谢。你提出的问题没有让我想起布莱德·凯恩斯?如果我还遗漏了什么,对不起?谢谢。你提出的问题没有让我想起布莱德·凯恩斯?如果我还遗漏了什么,对不起?