【发布时间】:2018-03-14 03:17:43
【问题描述】:
所以我有一个事实weather(jan, 17, cold, wind, snow).
和规则
match(W,D,T) :-
weather(W,D,T,_,_)
; weather(W,D,_,T,_)
; weather(W,D,_,_,T).
当我输入match(jan, 17, wind). Prolog 返回true; false. 我希望它只返回true,但它也返回false,我该如何解决这个问题?
【问题讨论】:
-
您对
weather/5的定义有一些内在的歧义,因为第 3、第 4 和第 5 个参数可以互换地表示任何含义。因此,如果您尝试编写一个适当的通用谓词,如match/3,它将有选择点。当您看到true作为提示时,这意味着 Prolog 成功,但有一个选择点需要返回以检查另一个可能的解决方案(因为,如果它在数据库中,weather(jan, 17, wind, snow, cold)也可能是有效的匹配的事实)。当 Prolog 找不到更多解决方案时,它最终会给出false。正常。 -
您可以像@Zebollo 建议的那样使用剪切,这会修剪选择点,但是您会失去解决方案的一般性。对于合法具有多个解决方案的查询,它不会产生多个结果。