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
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解析器需要更多的输入,并将看到下一个事实作为当前子句的一部分;您应该在子句末尾加上点(,
)
谓词在语义上是不正确的,因为这个问题只说明了Nick的情况:因此,你不能使用friends/2
作为人称,你应该像这样专门化它:X
你的friends(nick,Y):- programming(Y,java), programming(Y,python).
版本说:“如果X和Y都能用Java和Python编程,那么X就是Y的朋友”;尽管这导致Nick是所有使用Java和Python编程的人的朋友,但您的陈述超出了应该允许的范围:例如,我们不知道Jim是否根据这些规则决定谁是他的朋友。例如,Jim可能(尽管可能不太可能)想从他的朋友那里学到东西,例如,他只和至少懂一种编程语言但他不精通的人交朋友friends/2
- 最后一个问题可以写成:
这句话的一个近乎机械的翻译是:“如果尼克在X中编程,吉姆在X中编程”;(请注意,这不是当且仅当);因此,您仍然可以添加Jim可以使用的其他语言programming(jim,X) :- programming(nick,X).