2015-09-21 65 views
3

我想在序言以下事实和规则来形容:序言 - 描述的事实和规则

  1. 尼克是在Java编程。
  2. 尼克是Python编程
  3. 尼克的朋友与任何人是编程Java和Python
  4. 吉姆是尼克做了所有语言编程。

我找到了解决方案1,2和3,但不是第四,即使我真的很感谢一个完整的解决方案。

我的解决办法:

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), 

回答

3

有解决方案中的几个误区:

  • 恒定的(如Nick)与大写字母开始是不恒定的;但是一个变量。因此,行:

    male(Nick). 
    

    说,每个人都是一个male/1;您应该将其更正为:

    male(nick). 
    male(jim). 
    

    (对于programming/2顺便一提)。此外,这似乎不属于任务(?)的一部分。

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

  • friends/2谓词是语义不正确的,因为这个问题不仅使约尼克声明:因此,你不能使用X的人,你应该专门它想:

    friends(nick,Y):- 
        programming(Y,java), 
        programming(Y,python). 
    

    你的friends/2版本说:“一个人X是一个人的朋友Y,如果X和Y都可以用Java和Python编程”;尽管这导致了Nick是每个用Java和Python编程的人的朋友,但是你的陈述比应该允许的更广泛:我们不知道Jim是否根据这些规则决定谁是他的朋友。例如,Jim可能(尽管可能不太可能)希望从他的朋友那里学习东西,例如只有知道至少一种他不掌握的编程语言的人才是朋友。

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

    programming(jim,X) :- 
        programming(nick,X). 
    

    该语句的近乎机械的翻译是:“吉姆是编程X 如果尼克是在X编程”; (请注意,这不是,如果 - 只 - 如果);所以您仍然可以添加Jim可以使用的其他语言。

+0

非常感谢!我错误地使用了大写字母,逗号在那里是因为“复制粘贴”。所以,通过纠正错误并添加代码的最后部分,我正确回答了所有4个问题。 – ChrisK

+1

是的,我刚看到它,很酷,它真的很有帮助,再次感谢! – ChrisK