Prolog 如何按照用户定义的模式比较变量?

Prolog 如何按照用户定义的模式比较变量?,prolog,Prolog,我的谓词需要根据用户设置的模式比较变量 例如: p1([A,A,B,A],[1,1,5,1]). true p1([A,A,B,C],[1,1,1,5]). false p1([A,B,B,A,C],[2,3,3,2,1]). true 等等 目前,我的代码只适用于2个变量。我不知道如何使整个过程递归 isEqual(A,A). pattern([A],X):-isEqual(A,X). pattern([A,A],X):-isEqual(A,A),isEqual(X,[N1,N2]),

我的谓词需要根据用户设置的模式比较变量

例如:

p1([A,A,B,A],[1,1,5,1]).
true

p1([A,A,B,C],[1,1,1,5]).
false

p1([A,B,B,A,C],[2,3,3,2,1]).
true
等等

目前,我的代码只适用于2个变量。我不知道如何使整个过程递归

isEqual(A,A).

pattern([A],X):-isEqual(A,X).
pattern([A,A],X):-isEqual(A,A),isEqual(X,[N1,N2]),isEqual(N1,N2).
pattern([A,B],X):-isEqual(X,[N1,N2]),not(isEqual(N1,N2)),A\==B.

这个谓语本质上是不纯的。 似乎有意的是模式中的所有变量都是不同的

pattern_instance(Varpattern, Instance) :-
   term_variables(Varpattern, Vs),
   \+ \+ ( Varpattern = Instance, alldifferent(Vs) ).

alldifferent([]).
alldifferent([X|Xs]) :-
   maplist(dif(X), Xs),
   alldifferent(Xs).

你所说的内在不纯是什么意思?这个谓词没有也不能表现得像一个关系
X=Y,pattern_实例([X,Y],[1,1])
成功,但其泛化
pattern_实例([X,Y],[1,1])
失败。这是你想要的,但那不是一种纯粹的关系。