gpt4 book ai didi

Prolog 语句永远不会统一

转载 作者:行者123 更新时间:2023-12-02 01:39:51 24 4
gpt4 key购买 nike

我有 3 条递归规则,但其中一条从未与我的查询统一。

checkCollisionDiagonal(QueenTarget,[],Qdist,0).
checkCollisionDiagonal(QueenTarget, [Q|QueenList], Qdist, X):-
abs(QueenTarget - Q) =\= Qdist,
NextQdist is Qdist + 1,
checkCollisionDiagonal(QueenTarget, QueenList, NextQdist, X).
checkCollisionDiagonal(QueenTarget, [Q|QueenList], Qdist, X):-
abs(QueenTarget - Q) = Qdist,
NextQdist is Qdist + 1,
checkCollisionDiagonal(QueenTarget, QueenList, NextQdist, X1),
X is X1+1.

绝对值与 Qdist 不同的语句工作正常,如果它不能统一我的程序应该检查下一条语句(绝对值等于 Qdist 的语句),但是使用跟踪我注意到第二条语句( abs = Qdist) 永远不会被评估。为什么会发生这种情况?

我的查询是 checkCollisionDiagonal(1, [2,1,4,1], 1, X)。 预期结果应该是 2,但它总是返回 false

最佳答案

为什么你的程序失败了?显然,您的程序(无论出于何种原因)过于特化。因此,让我们概括您的程序,使其仍然失败,但至少会小一点。为此,让我们使用 * 来删除目标,从而概括该程序。而且您的查询还可以通过用简单的下划线替换子列表 [1,4,1] 来概括。

:- op(950, fy, *).* _. % the goal is just true insteadcheckCollisionDiagonal(_QueenTarget,[],_Qdist,0).checkCollisionDiagonal(QueenTarget, [Q|QueenList], Qdist, X):-    abs(QueenTarget - Q) =\= Qdist,    * NextQdist is Qdist + 1,    * checkCollisionDiagonal(QueenTarget, QueenList, NextQdist, X).checkCollisionDiagonal(QueenTarget, [Q|QueenList], Qdist, X):-    abs(QueenTarget - Q) = Qdist,     * NextQdist is Qdist + 1,    * checkCollisionDiagonal(QueenTarget, QueenList, NextQdist, X1),    * X is X1+1.?- checkCollisionDiagonal(1, [2|_/*,1,4,1*/], 1, X) ).   false.

因为这个通用程序失败了,你的原始程序也会失败。所以现在你有一个更小的部分来找到有问题的错误(已经被另一个答案给出了)。

关于Prolog 语句永远不会统一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71794245/

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