Prolog查询:基于事实的返回值

时间:2018-08-26 19:47:47

标签: prolog

我对Prolog整体还是陌生的,我正在学习prolog查询。

我正在看本教程。 http://www.cs.trincoll.edu/~ram/cpsc352/notes/prolog/factsrules.html 并尝试使用我自己的数据库。

Person("Mike", "123456").   //Person(Name,ID)
Info("CA", "123456", "17"). //Info(State, ID, Age)

我正在尝试做的事情:

我正在尝试通过某人的姓名和国家来返回其年龄。 通过执行以下查询,应返回17。

Age_Of(Name, State, N) :- Info(State, Person(Name, X), N).

我尝试了上面的代码,但返回“否”。我认为它仍然被评估为布尔值。但是,我希望该函数返回实际年龄。

1 个答案:

答案 0 :(得分:2)

首先,让我们指出一些事实:

  • 您应该在不使用大写字母作为首字母的情况下编写事实数据库。因此,Person("Mike", "123456").应该是person("Mike", "123456").,而Info("CA", "123456", "17").应该是info("CA", "123456", "17").
  • 序言中没有功能,只有谓词,也应使用非大写字母来定义,因此Age_Of(Name, State, N)应该为age_of(Name, State, N).
  • 即使删除所有首字母,执行代码时也会得到Singleton variables: [X]。这意味着您已定义了一个变量,在本例中为X,但未在任何地方使用。在这种情况下,应将每个单例变量替换为_或在变量之前添加_(在这种情况下为_X)。

要解决您的问题,这是解决方案:

person("Mike", "123456").   % person(Name,ID)
info("CA", "123456", "17"). % info(State, ID, Age)


age_of(Name, State, Age):-
   person(Name,ID),
   info(State, ID, Age).

因此,首先必须找到具有给定名称的人的ID,然后找到相应的年龄。查询:

?- age_of(Name,State,Age).
Age = "17",
Name = "Mike",
State = "CA"

此查询非常通用,您可以更具体(例如,指定名称)。希望能帮助到你。