Prolog运行的底层机制是什么?

问题描述 投票:0回答:1

我有上面的代码,我不确定调用 has_divisor 时会调用两个 has_divisor 子句中的哪一个。有人可以向我解释一下吗?

is_prime(2).
is_prime(3).
is_prime(P):-
    P>3,
    integer(P),
    P mod 2 =\= 0,
    \+ has_divisor(P,3).
has_divisor(N,D):-
    N mod D =:= 0.
has_divisor(N, D):-
    D * D < N,
    D2 is D + 2,
    has_divisor(N, D2).
swi-prolog
1个回答
1
投票

谓词

has_divisor
设计有两个不同的子句。当它被调用时,Prolog 解释器遵循特定的逻辑顺序。最初,它尝试将提供的参数与第一个子句中概述的条件进行匹配。如果此匹配过程不成功,解释器将继续执行第二个子句。

实际上,如果我们使用参数 N 和 D 调用

has_divisor
,Prolog 将通过考虑第一个子句来启动匹配过程:
has_divisor(N, D) :- N mod D =:= 0.
如果
N mod D =:= 0
的评估返回 true,则选择该子句。本质上,当 N 除以 D 的余数等于 0 时,第一个子句就适用。另一方面,如果不满足这个条件,解释器会将焦点转移到第二个子句:
has_divisor(N, D) :- D * D < N, D2 is D + 2, has_divisor(N, D2).

为了分解第二个子句,它本质上是检查

D
的平方(表示为 D * D)是否小于
N
。如果此比较成立,则解释器通过添加 2(D2 是 D + 2)将
D
的值提高到
D2
,然后以更新值
has_divisor
N
递归地使用
D2
谓词。 .

© www.soinside.com 2019 - 2024. All rights reserved.