首页 > 解决方案 > Prolog 变量没有按预期统一

问题描述

我在 Prolog 中编写了以下内容来测试第二个数组是否像第一个数组一样,除了它有两倍的值:

twice([],[]).
twice([X|T1], [X1, X2|T2]) :- X == X1, X == X2, twice(T1, T2).

当我写时twice([1,2],[1,1,2,2]).我得到true,但是当我查询时:twice([1,2], X).我得到false而不是X = [1,1,2,2],有什么问题?

标签: prolog

解决方案


那是因为==/2[swi-doc]应该统一。它测试两个术语是否相同(对于变量,如果它们是相同的变量)。统一是通过=/2[swi-doc]完成的:

Term1与统一Term2True如果统一成功。

因此,您可以编写X = X1,但这不是必需的。使用相同的变量将统一 vales,因此您可以实现twice/2为:

twice([], []).
twice([X|T1], [X,X|T2]) :-
    twice(T1, T2).

推荐阅读