Prolog 序言-描述事实和规则

Prolog 序言-描述事实和规则,prolog,Prolog,我想在序言中描述以下事实和规则: 尼克正在用Java编程 尼克正在用Python编程 Nick与任何使用Java和Python编程的人都是朋友 吉姆正在用尼克所用的所有语言编程 我找到了1、2和3的解决方案,但没有找到第4个,尽管我真的很感激完整的解决方案 我的解决方案: male(Nick). male(Jim). programming(Nick, java). programming(Nick, python). friends(X,Y):- programming(X,j

我想在序言中描述以下事实和规则:

  • 尼克正在用Java编程
  • 尼克正在用Python编程
  • Nick与任何使用Java和Python编程的人都是朋友
  • 吉姆正在用尼克所用的所有语言编程
  • 我找到了1、2和3的解决方案,但没有找到第4个,尽管我真的很感激完整的解决方案

    我的解决方案:

    male(Nick).
    
    male(Jim).
    
    programming(Nick, java).
    
    programming(Nick, python).
    
    friends(X,Y):-
        programming(X,java),
        programming(X,python),
        programming(Y,java),
        programming(Y,python),
    

    您的解决方案中存在一些错误:

    • 以大写字母开头的常量(如
      Nick
      )不是常量;而是一个变量。因此,该行:

      male(Nick).
      
      说每个人都是
      男性/1
      ;您应该将其更正为:

      male(nick).
      male(jim).
      
      (顺便说一句,
      编程/2
      也一样)。 此外,这似乎不是任务(?)的一部分

    • friends/2
      谓词以逗号(
      )结尾,这意味着Prolog解析器需要更多的输入,并将看到下一个事实作为当前子句的一部分;您应该在子句末尾加上点(

    • friends/2
      谓词在语义上是不正确的,因为这个问题只说明了Nick的情况:因此,你不能使用
      X
      作为人称,你应该像这样专门化它:

      friends(nick,Y):-
          programming(Y,java),
          programming(Y,python).
      
      你的
      friends/2
      版本说:“如果X和Y都能用Java和Python编程,那么X就是Y的朋友”;尽管这导致Nick是所有使用Java和Python编程的人的朋友,但您的陈述超出了应该允许的范围:例如,我们不知道Jim是否根据这些规则决定谁是他的朋友。例如,Jim可能(尽管可能不太可能)想从他的朋友那里学到东西,例如,他只和至少懂一种编程语言但他不精通的人交朋友

    • 最后一个问题可以写成:

      programming(jim,X) :-
          programming(nick,X).
      
      这句话的一个近乎机械的翻译是:“如果尼克在X中编程,吉姆在X中编程”;(请注意,这不是当且仅当);因此,您仍然可以添加Jim可以使用的其他语言


    非常感谢!我错用了大写字母,逗号是因为“复制粘贴”而出现的。因此,通过纠正错误并添加代码的最后一部分,我回答了所有4个问题,对吗?