在Prolog中我可以写
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).然后写
?- findall(X,descend(martha,X),Z).得到四种解决方案
Z = [charlotte,caroline,laura,rose]但如果我再加上一个普遍的事实
likes(X,pomegranate).并尝试
?- findall(X,likes(X, pomegranate),Z).我得到:
Z = [_G17].那是什么_G17?从本质上说,要得到所有变量,我需要更改什么?(因为likes(X,pomegranate)应该意味着一切都喜欢石榴。)对吧?):
Z = [martha,charlotte,caroline,laura,rose]发布于 2016-04-23 06:41:43
两种解决方案。干净的解决方案是有一个表格,列出你所描述的宇宙中的所有“事物”:
person(martha).
person(charlotte).
% etc然后你的“喜欢”会是:
person_likes(P, pomegranate) :-
person(P).你也可以尝试破解它:
person(P) :- child(P, _).
person(P) :- child(_, P).但这是..。不满意?考虑一下关系数据库:您将有两个表:
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的解析策略。
https://stackoverflow.com/questions/36806750
复制相似问题