Prolog - 描述事实和规则

Prolog - Describe facts and rules

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

  1. 尼克正在Java编程。
  2. Nick 在Python
  3. 编程
  4. Nick 是在 Java 和 Python
  5. 中编程的任何人的朋友
  6. 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 版本说:"A person X is a friend of a person Y, if both X and Y can program in Java and Python";尽管这导致 Nick 是在 Java 和 Python 中编程的每个人的朋友,但您的陈述超出了应允许的范围:例如,我们不知道 Jim 是否决定了谁是根据这些规则与他交朋友。例如,Jim 有可能(虽然可能不太可能)想从他的朋友那里学习东西,例如,他只与至少知道一种他不掌握的编程语言的人做朋友。

  • 最后一题可以写成:

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

    语句的几乎机械翻译是:"Jim is programming in X if nick is programming in X"; (注意这不是 if-and-only-if);所以您仍然可以添加 Jim 可以使用的其他语言。