首页 > 解决方案 > Prolog:为什么这个谓词显示为真?

问题描述

所以我在 SWI prolog 中编写了这个谓词,目的是如果它的参数是一个没有任何原子的表达式,它会成功

no_atoms(X):- var(X), !, fail.
no_atoms(X):- atom(X); number(X).
no_atoms(X+Y):- no_atoms(X), no_atoms(Y).
no_atoms(X-Y):- no_atoms(X), no_atoms(Y).

测试这个 no_atoms(5-(3+x)) 应该是假的, no_atoms((12+8)-7) 应该是真的,但是两者都是真的,我不确定有什么问题?

标签: prologlogic

解决方案


如果no_atoms(X)在 termX没有原子时目标必须成功,则必须消除atom(X)定义的第二个子句中的条件。no_atoms/1

no_atoms(X) :- var(X), !, fail.
no_atoms(X) :- number(X).
no_atoms(X+Y) :- no_atoms(X), no_atoms(Y).
no_atoms(X-Y) :- no_atoms(X), no_atoms(Y).

运行示例:

?- no_atoms((12+8)-7).
true.

?- no_atoms(5-(3+x)).
false.

?- no_atoms(X).
false.

另外,由于变量不是原子,也许更好的定义如下:

no_atoms(X) :- var(X), !.
no_atoms(X) :- number(X).
no_atoms(X+Y) :- no_atoms(X), no_atoms(Y).
no_atoms(X-Y) :- no_atoms(X), no_atoms(Y).

运行示例:

?- no_atoms((12+8)-7).
true.

?- no_atoms(5-(3+x)).
false.

?- no_atoms(X).
true.

推荐阅读