prolog - 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) 应该是真的,但是两者都是真的,我不确定有什么问题?
解决方案
如果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.
推荐阅读
- pandas - 寻找一种使用应用函数将列添加到数据框的有效方法
- orbeon - 如何在 Orbeon 表单 CE 中为时间输入字段创建下拉列表
- r - 跨两个向量查找不匹配位置,包括 NA
- angular - 如何将 FormGroups 和 FormArrays 传递到深度嵌套组件的递归机制中?
- python - 如何检查列表中的所有项目是否属于同一类型?
- php - 在 Web 中使用 PHP 显示 SQL SERVER 的结果?
- flutter - Flutter 中的 initState 在 SQLite 数据库上返回 null 吗?
- python-3.x - 写入文件列表,其中第 1 列的唯一字符串从第 2 列获取多个字符串
- android - 在一个 RecyclerView 中,传递相反的拖动动作事件来查看它下面
- flutter - 应用程序从权限设置屏幕返回后,颤动应用程序中的空白屏幕