gpt4 book ai didi

prolog - 为什么 Prolog 在这个简单的例子中会崩溃?

转载 作者:行者123 更新时间:2023-12-05 01:28:40 24 4
gpt4 key购买 nike

likes(tom,jerry).
likes(mary,john).
likes(mary,mary).
likes(tom,mouse).
likes(jerry,jerry).
likes(jerry,cheese).
likes(mary,fruit).
likes(john,book).
likes(mary,book).
likes(tom,john).

likes(john,X):-likes(X,john), X\=john.

你好,上面是一个非常简单的序言文件,有一些事实和只有一个规则:约翰喜欢任何喜欢他的人。
但是在加载此文件并询问 Prolog 后,以下查询:
likes(john,X).

程序崩溃。原因是不知何故序言卡在 likes(john,john)即使规则规定 X\=john .

有什么建议吗?

最佳答案

具有讽刺意味的是,鉴于我们所在的站点,您会遇到堆栈溢出。

它这样做是因为 prolog 使用的执行顺序,它将在 likes(X,john) 处进入无限递归。在您的规则中,它再次激活规则 - 不是事实 - 永远不会到达 X\=john少量。

解决此问题的一种方法是让您的规则命名与您的事实不同,如下所示:

kindoflikes(tom,jerry).
kindoflikes(mary,john).
kindoflikes(mary,mary).
kindoflikes(tom,mouse).
kindoflikes(jerry,jerry).
kindoflikes(jerry,cheese).
kindoflikes(mary,fruit).
kindoflikes(john,book).
kindoflikes(mary,book).
kindoflikes(tom,john).

likes(Y,X):- kindoflikes(X,Y), X\=Y.
likex(Y,X):- kindoflikes(Y,X), X\=Y.

注意两个规则定义中 kindoflikes 中 X 和 Y 的颠倒。
所以你得到:
?- likes(john,X).
X = mary ;
X = tom ;
X = book.

但是您并没有被限制在寻找 john 喜欢的东西上,您可以这样做:
?- likes(jerry,X).
X = tom ;
X = cheese.

关于prolog - 为什么 Prolog 在这个简单的例子中会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10360223/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com