声明一个变量

时间:2013-09-30 21:08:53

标签: variables prolog

自从高中以来我没有触及Prolog,尽管我试图找到这些信息,但它并没有帮助。以下是必须说明我的问题的示例:

%% everybody():- [dana, cody, bess, abby].
%% Everybody = [dana, cody, bess, abby].

likes(dana, cody).
hates(bess, dana).
hates(cody, abby).

hates(X, Y):- \+ likes(X, Y).

likes_somebody(_, []):- fail.
likes_somebody(X, [girl | others]):-
    likes(X, girl) ; likes_somebody(X, others).

likes_everybody(_, []):- true.
likes_everybody(X, [girl | others]):-
    likes(X, girl) , likes_everybody(X, others).

maplist(likes_somebody, [dana, cody, bess, abby], [dana, cody, bess, abby]).

如何宣布everybody成为女生名单?评论的行是我尝试过的行,但我收到了奇怪的错误消息。

到目前为止,这是tutorial我或多或少。我正在使用GProlog,如果它有任何区别。对不起这个基本问题。 GProlog的手册不涉及语言语法,但我当然看到了那里。顺便说一下,我将非常感谢有关在哪里查找语言文档的信息(而不是实现文档)。

1 个答案:

答案 0 :(得分:2)

Prolog中的每个变量都必须以大写字母开头。因此,对于初学者,您需要Everybody,而不是everybody

第二个问题,Prolog中的变量不是assignables。所以你想要做的就是做一个事实并改为使用它:

everybody([dana, cody, bess, abby]).

您的底线代码实际上是一个事实定义,并将尝试覆盖maplist/3。您可能想要做的是将该行上方的所有内容放入文件(例如,称为likes.pl),然后查阅它([likes].)。然后你可以运行这样的查询:

?- everybody(Everybody), maplist(likes_somebody, Everybody, Everybody).

这不起作用,因为likes_somebody/2处理第二个参数中的列表。您对likes_somebody/2的谓词可以写成:

likes_somebody(_, []).

但仍然没有多大意义。它简单地将任何内容与空列表统一起来:

?- likes_somebody(chicken_tacos, []).
true.

你真的需要一个谓词告诉你某人是否是女孩,如下:

girl(dana).
girl(cody).
girl(bess).
girl(abby).

然后你可以做我认为你想做的事情,这更接近于此:

likes_somebody(X) :- girl(X).

然后maplist构造就像这样:

everybody(Everybody), maplist(likes_somebody, Everybody).

这将简单地返回true。您可以使用everybody/1来简化和消除findall(Girl, girl(X), Everybody),但这会变得很奇怪。

您尝试使用likes_everybody/2进行列表处理,但它已被破坏,因为girl字面上是girl,而不是变量,others字面上是{{1不是可能是另一个列表尾部的某种列表。

我认为你还有一些需要清理的旧想法。阅读更多内容,再写一些内容,您的代码将开始变得更有意义。