繁体   English   中英

Prolog - 描述事实和规则

[英]Prolog - Describe facts and rules

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

  1. 尼克是用Java编程的。
  2. 尼克用Python编程
  3. Nick是任何使用Java和Python编程的人的朋友
  4. Jim正在使用Nick所做的所有语言编程。

我找到了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). 

    说每个人都是male/1 ; 你应该纠正它:

     male(nick). male(jim). 

    (顺便说一下programming/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是否根据这些规则决定谁是他的朋友。 例如,吉姆想要从他的朋友那里学习东西是可能的(尽管可能不太可能),例如,他们只是知道至少一种他不掌握的编程语言的人的朋友。

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

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

    语句的几乎机械翻译是: 如果尼克在X中编程, Jim在X中编程” ; (介意这不是if-only-only-if ); 所以你仍然可以添加Jim可以使用的其他语言。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM