代码之家  ›  专栏  ›  技术社区  ›  user797257

声明一个变量

  •  1
  • user797257  · 技术社区  · 13 年前

    我从高中起就没有接触过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 回复  |  直到 13 年前
        1
  •  2
  •   Daniel Lyons Paulo Moura    13 年前

    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 处理第二个参数中的列表。你的谓词 喜欢某人/2 可以写成:

    likes_somebody(_, []).
    

    但仍然没有多大意义。它只是将任何东西与空列表统一起来:

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

    你真的需要一个谓词来告诉你某人是否是女孩,就像这样:

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

    然后你可以做我认为你正在努力做的事情,这更接近于这个:

    likes_somebody(X) :- girl(X).
    

    然后,地图列表构造将像这样工作:

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

    这将简单地返回真值。您可以简化和消除 everybody/1 而是使用 findall(Girl, girl(X), Everybody) 但这越来越奇怪了。

    您正尝试使用进行列表处理 likes_everybody/2 ,但它坏了,因为 girl 是字面意思 女孩 ,不是变量,以及 others 是字面意思 其他 ,而不是某种可能是另一个列表尾部的列表。

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

    推荐文章