在Prolog中声明和搜索列表的正确方法?

时间:2016-03-17 01:08:49

标签: prolog

我是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]).

有人能指出我正确的方向吗?提前谢谢。

2 个答案:

答案 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