我是Prolog的新手。是否有可能宣布"列表作为Prolog中的事实,然后轻松访问它?我正在研究家庭树型问题。首先,我想宣布一群男性属于男性名单。然后,我希望能够查询某个人是否是男性。这是我到目前为止编写的代码:
% ------------------------------------------------------------------------- %
% Facts:
males([john, joseph, aaron, peter, paul, mark, ben, adam, daniel]).
% ------------------------------------------------------------------------- %
% Rules:
% Member of a List
member(X, [X|_]).
member(X, [_|T]) :- member(X, T).
male(X) :- member(X, males).
但是,我的输出不符合预期:
21 ?- male(john).
假。
我知道我的member()规则正在运行,因为我可以产生以下结果:
23 ?- member(john, [peter, paul, john]).
真
有人能指出我正确的方向吗?提前谢谢。
答案 0 :(得分:1)
在Prolog中执行此操作的通常方法是将您的列表声明为事实表:
male(john).
male(joseph).
% etc
如果您这样做,您已经定义了male/1
并可以像这样查询:
?- male(joseph).
true.
或者像这样:
?- male(M).
M = john ;
M = joseph ;
% etc
您可以通过阅读first chapter of "Learn Prolog Now!"来开始Prolog。它的第一个例子和你的问题完全相同。
答案 1 :(得分:0)
我不是prolog的专家,但我知道解决方案(可能不是唯一的解决方案)
男性(X): - 男性(Y),成员(X,Y)
我理解它的方式是谓词不返回变量,它们为给定的参数赋值,所以Y现在已经分配了男性数组,现在你可以在Y中查找X