1

我从高中起就没有接触过 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只是女孩的名单?注释行是我尝试过的行,但我收到了奇怪的错误消息。

这是我到目前为止或多或少遵循的教程。我正在使用 GProlog,如果它有什么不同的话。抱歉问了这么一个基本问题。GProlog 的手册不涉及语言语法,但我确实看过那里。顺便说一句,我将不胜感激有关在哪里查找语言文档(而不是实现文档)的信息。

4

1 回答 1

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,但它已损坏,因为girlis 从字面上看girl,不是变量,并且others从字面上看others,不是某种可能成为另一个列表尾部的列表。

我认为您仍然有一些旧想法需要清理。多读一些,多写一些,你的代码就会开始变得更有意义。

于 2013-09-30T21:20:54.997 回答