【问题标题】:prolog f(X) :- X==[]序言 f(X) :- X==[]
【发布时间】:2021-07-01 19:48:15
【问题描述】:

当我有序言程序时

f(X) :- X==[].

输出是

|:-f(X).
false.
:-f([]).
true.

在第一个输出序言中声称没有X,因此f(X) 为真。

但是f([]) 是真的,所以prolog 应该说X=[]。作为第一个查询的答案。

这是为什么?我该如何解决它。

a(X,X).
b(A,B) :- A==X,B==X.

还有一个更严重的问题:

|:-a([a],[a]).
true.
:-b([a],[a]).
false.

我相信ab 是完全相同的陈述,只是写法不同。

IDE 声称 A==X 总是错误的,所以我想我对变量在 prolog 中的工作方式有一个严重的误解。

【问题讨论】:

  • (==)/2 不是纯关系。它是在当前时间点* 进行的测试。请改用(=)/2 来获得您可能期望的结果。因此b(A,B) :- A=X, B=X.

标签: prolog


【解决方案1】:

==/2 并没有按照你的想法去做。引用文档,@Term1 == @Term2

如果Term1 等价于Term2,则为真。变量仅与共享变量相同。

这意味着A == A 为真,但A == B 为假,A == [] 为假。

你要找的是统一=/2,在哪里

  • A = A 是真的
  • A = B 为真(AB 成为同一个变量:A = B, A = 3 导致 AB 都变为 3)。
  • A = [] 为真(且A 与空列表统一)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    相关资源
    最近更新 更多