自从高中以来我没有触及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的手册不涉及语言语法,但我当然看到了那里。顺便说一下,我将非常感谢有关在哪里查找语言文档的信息(而不是实现文档)。
答案 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不是可能是另一个列表尾部的某种列表。
我认为你还有一些需要清理的旧想法。阅读更多内容,再写一些内容,您的代码将开始变得更有意义。