【问题标题】:Proper way to Declare and Search List in Prolog?在 Prolog 中声明和搜索列表的正确方法?
【发布时间】:2016-03-17 20:41:14
【问题描述】:

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

是的

谁能指出我正确的方向?提前谢谢你。

【问题讨论】:

  • Prolog 不是这样工作的。 males 不是返回列表的函数。这是您声明的事实,需要对其进行查询:male(X). 查询将返回X = [john, joseph, aaron, peter, paul, mark, ben, adam, daniel]。但请参阅鲍里斯的回答,以更恰当地断言这些事实。

标签: prolog


【解决方案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。它的第一个例子和你的问题完全一样。

【讨论】:

    【解决方案2】:

    我不是 prolog 方面的专家,但我知道解决方案(可能不是唯一的)

    男性(X):- 男性(Y),成员(X,Y)

    我的理解是谓词不返回变量,它们将值分配给给定的参数,因此 Y 现在已分配给男性数组,现在您可以在 Y 中查找 X

    【讨论】:

    • 感谢您阐明谓词的工作原理。那是我的问题。当然,您的解决方案有效。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多