我想在序言中描述以下事实和规则:
- Nick 正在使用 Java 进行编程。
- Nick 正在使用 Python 编程
- Nick 是任何使用 Java 和 Python 编程的人的朋友
- 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
顺便一提)。
此外,这似乎不是作业的一部分(?)。
The friends/2
谓词以逗号结尾 (,
) 意味着 Prolog 解析器需要更多输入,并将下一个事实视为当前子句的一部分;您应该以点结束子句 (.
);
-
The friends/2
谓词在语义上不正确,因为问题仅对尼克进行了陈述:因此您不能使用X
作为一个人,你应该将其专业化,例如:
friends(nick,Y):-
programming(Y,java),
programming(Y,python).
你的版本friends/2
said: “如果 X 和 Y 都能用 Java 和 Python 编程,那么 X 就是 Y 的朋友”;尽管这导致 Nick 是每个使用 Java 和 Python 编程的人的朋友,但您的陈述超出了应允许的范围:我们不知道 Jim 是否根据这些规则决定谁是他的朋友。例如,吉姆有可能(尽管也许不太可能)想从他的朋友那里学习东西,并且例如只与至少了解一种他不掌握的编程语言的人成为朋友。
-
最后一个问题可以写成:
programming(jim,X) :-
programming(nick,X).
该声明的近乎机械翻译是:“Jim 正在使用 X 编程if尼克正在 X 中编程”; (请注意,这不是当且仅当);因此您仍然可以添加 Jim 可以使用的其他语言。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)