【问题标题】:Prolog: Why is this predicate showing up as true?Prolog:为什么这个谓词显示为真?
【发布时间】:2021-03-31 18:03:55
【问题描述】:

所以我在 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) 应该是真的,但是两者都是真的,我不确定有什么问题?

【问题讨论】:

  • 小写 x 是一个原子。大写X 是一个可能未绑定的变量。您可以尝试使用未绑定的大写 X 查询 no_atoms(5-(3+X))
  • 谢谢,大写是假的,但是有没有办法在用小写x查询时证明它是假的?
  • 您必须检查哪些原子是您的表达式变量,例如单个字母。 var/1是检查参数当前是否为未绑定变量
  • 这让我很困惑。什么是“表达”? X*Y不是“表达”吗?如果atoms+-不算数,“没有任何原子”是什么意思?

标签: prolog logic


【解决方案1】:

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

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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多