gpt4 book ai didi

prolog - 需要帮助理解 Prolog 中的某些东西

转载 作者:行者123 更新时间:2023-12-01 11:57:14 25 4
gpt4 key购买 nike

我是 Prolog 的初学者,发现很难理解回溯在使用规则时的工作原理。我什至不知道回溯是否在规则中起作用(想正确地了解它)。

我有以下程序对列表中的所有偶数求和。我自己写的,但发现很难理解找到解决方案所需的步骤。

evenN(X):- (X mod 2) =:= 0.

sumEven([], 0).
sumEven([H|T], X):- evenN(H), sumEven(T,Y), X is Y+H.
sumEven([H|T], X):- \+evenN(H), sumEven(T,X).

输出:::

?- sumEven([1,2,3,4,5,6],X).
X = 12

需要帮助以更好地理解它。我尝试使用 trace 实用程序来理解输出,但我不理解它,这就是我在这里提问的原因。

问题:

1)

当我注释掉第二条规则(最后一行)时,它给了我失败作为答案,因为 1 不是偶数并且整个 sumEven() 失败,因为 evenN() 失败,我理解。我的问题是:之后会发生什么?它会回到顶部并尝试 sumEven([], 0) 事实还是?我只想知道会发生什么。

2)

当包含最后一行(第二条规则)并且第一条规则失败时,当它回溯时,它是否会寻找跟在它后面的另一个 sumEven()(就像第二条规则跟在第一条失败的规则之后一样)或它返回顶部并测试 sumEven([], 0) 事实并从那里开始?

我需要了解当规则在 prolog 中使用时它是如何回溯的,特别是在像这样的递归情况下。

3)我在网上找到了以下代码(递归)。它将列表分为正面列表和负面列表。

% predicates
split(list,list,list)

% clauses
split([],[],[]).
split([X|L],[X|L1],L2):-
X>= 0,
!,
split(L,L1,L2).

split([X|L],L1,[X|L2]):-
split(L,L1,L2).

Output :

Goal: split([1,2,-3,4,-5,2],X,Y)

X=[1,2,4,2], Y=[-3,-5]

有人可以帮助我了解找到解决方案的方式吗?我的意思是我想逐步了解它是如何执行以提出解决方案的。

最佳答案

匹配子句按照它们在程序中出现的顺序进行尝试。在漂亮的声明式 Prolog 程序中,子句的顺序不会改变程序的含义。这接近于逻辑,其中析取是可交换的。 sumEven/2 具有此属性。不过,它的名字非常错误,因为总和是关系的第二个参数,而不是第一个。更好的名字例如 even_sum/2,你可能会想出更好的名字。 split/3 使用 !/0,它破坏了这个属性并让子句的顺序变得重要。出于这个原因,本地 if-then-else ((->)/2 和 (;)/2) 似乎更适合这种情况。代替 trace/0,将 SWI-Prolog 的图形跟踪器与 ?- gtrace, your_goal. 一起使用,它还会向您显示在哪些点上仍有待尝试的替代方案。一般来说,从关系的角度思考并问:这个条款什么时候成立?它适用于 if ... 等。这使得推理更大的程序成为可能,在这些程序中,确切的执行流程可能更难理解。

关于prolog - 需要帮助理解 Prolog 中的某些东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5816801/

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