首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在prolog中找到普遍的事实?

如何在prolog中找到普遍的事实?
EN

Stack Overflow用户
提问于 2016-04-23 04:46:46
回答 1查看 212关注 0票数 2

在Prolog中我可以写

代码语言:javascript
复制
 child(martha,charlotte). 
 child(charlotte,caroline). 
 child(caroline,laura). 
 child(laura,rose). 

 descend(X,Y)  :-
    child(X,Y).
 descend(X,Y)  :-
    child(X,Z), 
    descend(Z,Y).

然后写

代码语言:javascript
复制
?-  findall(X,descend(martha,X),Z).

得到四种解决方案

代码语言:javascript
复制
Z  =  [charlotte,caroline,laura,rose]

但如果我再加上一个普遍的事实

代码语言:javascript
复制
likes(X,pomegranate).

并尝试

代码语言:javascript
复制
 ?-  findall(X,likes(X, pomegranate),Z).

我得到:

代码语言:javascript
复制
 Z = [_G17].

那是什么_G17?从本质上说,要得到所有变量,我需要更改什么?(因为likes(X,pomegranate)应该意味着一切都喜欢石榴。)对吧?):

代码语言:javascript
复制
Z  =  [martha,charlotte,caroline,laura,rose]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-23 06:41:43

两种解决方案。干净的解决方案是有一个表格,列出你所描述的宇宙中的所有“事物”:

代码语言:javascript
复制
person(martha).
person(charlotte).
% etc

然后你的“喜欢”会是:

代码语言:javascript
复制
person_likes(P, pomegranate) :-
    person(P).

你也可以尝试破解它:

代码语言:javascript
复制
person(P) :- child(P, _).
person(P) :- child(_, P).

但这是..。不满意?考虑一下关系数据库:您将有两个表:

代码语言:javascript
复制
CREATE TABLE person (
  id INTEGER PRIMARY KEY, -- usually autogenerated
  name TEXT NOT NULL
);
CREATE TABLE parent_child (
  parent_id INTEGER NOT NULL,
  child_id INTEGER NOT NULL,
  FOREIGN KEY parent_id REFERENCES person(id),
  FOREIGN KEY child_id REFERENCES person(id)
);

据我所知,在Prolog中,您没有做完全相同的事情的唯一原因是,大多数入门教程都试图引诱您,并避免深入这些细节。当然,Prolog“数据库”不是真正的关系数据库(例如,参数位置很重要!)

在使用Prolog时,您不能不考虑Prolog的解析策略。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36806750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档