Prolog问题-平方数

Prolog问题-平方数,prolog,Prolog,我编写了一组两个谓词来测试一个数字是否是一个平方数 patrat_perfect(A):- patr(A, 0). patr(A, S):- A =:= S * S. patr(A,S):- A > S * S, T is S+1, patrat(A, T). patr(A,S):- A < S * S, fail. patrat_完美(A):-patr(A,0)。 patr(A,S):-A=:=S*S。 patr(A,S):-A>S*S,T是S+1,patrat(A,T)。

我编写了一组两个谓词来测试一个数字是否是一个平方数

patrat_perfect(A):- patr(A, 0).

patr(A, S):- A =:= S * S.

patr(A,S):- A > S * S, T is S+1, patrat(A, T).

patr(A,S):- A < S * S, fail.
patrat_完美(A):-patr(A,0)。
patr(A,S):-A=:=S*S。
patr(A,S):-A>S*S,T是S+1,patrat(A,T)。
零件(A,S):-A
第一个谓词,
patrat_perfect
只需执行对第二个谓词的调用,第二个参数的值为0,以及应该测试的数字是否为第一个参数的完美平方

patr
谓词实际上从
0
sqrt(A)
搜索该数字
S
,这符合等式
S*S=A
。为此,如果
A>S*S
,谓词使用
1
增加
S
的值。如果在下一次调用时,
A=S*S
,则谓词返回
true
;如果
A
,则谓词通过调用内置谓词
fail
返回
false


问题是每次调用
patrat\u perfect
谓词时,我都会收到假值。您能告诉我哪里出错了吗?

当我修复了您代码中的一个输入错误(您正在调用
patrat
,但没有定义它),它似乎工作正常(请参阅和)


可能您复制了错误的代码,或者您在其他地方定义了不同的
patrat

您试过调试谓词吗?您可以将谓词命名为“perfect\u square”和“square”。这样你就会注意到“patrat”没有定义。@Andy,如果没有谓词
patrat
,Prolog会抱怨,不会返回
false
。非常感谢!最初,我定义了谓词“patrat”,但我与其他谓词有一些冲突,所以我更改了它,忘记了更改规则体中谓词的名称。