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”,但我与其他谓词有一些冲突,所以我更改了它,忘记了更改规则体中谓词的名称。