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)
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)
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
)可能会让人困惑,因此您可以重命名其中一个谓词。谢谢。你提出的问题没有让我想起布莱德·凯恩斯?如果我还遗漏了什么,对不起?谢谢。你提出的问题没有让我想起布莱德·凯恩斯?如果我还遗漏了什么,对不起?