List 在Prolog中设置两个兼容列表的差异

List 在Prolog中设置两个兼容列表的差异,list,prolog,List,Prolog,我目前正试图在prolog中实现一个自动化的定理证明程序,但偶然发现了一个问题 如果我有一个列表,例如: [[1,2],[-1,3],[4,5,7],[-2,4]] 如何获得两个兼容列表项的“设置差异”: 我所说的兼容是指,如果某个数字的否定存在于另一个列表中,则用集合差替换这两个列表,即: [1,2]和[-1,3]是兼容的,因为第二个子句中存在-1,因此它应该返回[2,3]的设置差,新列表应该是[[2,3],[4,5,7],-2,4] 目前我有以下步骤谓词: memberlist(X,[[X

我目前正试图在prolog中实现一个自动化的定理证明程序,但偶然发现了一个问题

如果我有一个列表,例如:

[[1,2],[-1,3],[4,5,7],[-2,4]]
如何获得两个兼容列表项的“设置差异”: 我所说的兼容是指,如果某个数字的否定存在于另一个列表中,则用集合差替换这两个列表,即:
[1,2]
[-1,3]
是兼容的,因为第二个子句中存在
-1
,因此它应该返回
[2,3]
的设置差,新列表应该是
[[2,3],[4,5,7],-2,4]

目前我有以下
步骤
谓词:

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

step([]).
step([_|T]) :-
    memberlist(neg X,T),
    write(X),
    nl,
    step(T).
step([_|T]) :-
    step(T).
因此,它只是检查每个列表,检查变量的否定是否存在,以及是否将其写出。我已经添加了处理负数的代码,因此
X
将匹配
-X
X
是任意整数


我在这一点上非常困惑,任何帮助都将不胜感激。

另一种配方

  • memberlist
    将为您提供三元组
    p(X,Y,Z)
    其中
    Z
    neg(Z)
    位于
    X
    Y
  • 折叠将采用这样一个三元组,并从
    Xs
    中删除
    X
    Y
    ,然后向其添加
    X+Y-Z-neg(Z)
你的榜样

?- collapse([[1, 2], [neg(1), 3], [4, 5, 7], [neg(2), 4]], X).
X = [[2, 3], [4, 5, 7], [neg(2), 4]] ;
X = [[1, 4], [neg(1), 3], [4, 5, 7]] ;
false.

另一种可能的解决办法:

shrink([L1|R1], [L3|R2]) :-
    select(L2, R1, R2),
    difference(L1, L2, L3).
shrink([L1|R1], [L1|S]) :-
    shrink(R1, S).

difference(L1, L2, L3) :-
    select(X, L1, R1),
    compatible(X, Y),
    select(Y, L2, R2),
    union(R1, R2, L3).

compatible(neg(P), P) :- !.
compatible(P, neg(P)).
一些例子:

?- shrink([[1,2], [neg(1),3], [4,5,6], [neg(2),4]], S).
S = [[2, 3], [4, 5, 6], [neg(2), 4]] ;
S = [[1, 4], [neg(1), 3], [4, 5, 6]] ;
false.

?- shrink([[a,neg(b)], [a,b]], S).
S = [[a]] ;
false.

?- shrink([[rainning], [neg(rainning)]], S).
S = [[]] ;
false.

?- shrink([[rainning], [neg(rainning), wet_grass], [neg(wet_grass), green_grass]], S).
S = [[wet_grass], [neg(wet_grass), green_grass]] ;
S = [[rainning], [neg(rainning), green_grass]] ;
false.

?- shrink([[neg(green_grass)], [rainning], [neg(rainning), wet_grass], [neg(wet_grass), green_grass]], A), shrink(A, B), shrink(B, C).

A = [[neg(wet_grass)], [rainning], [neg(rainning), wet_grass]],
B = [[neg(rainning)], [rainning]],
C = [[]] ;

A = [[neg(wet_grass)], [rainning], [neg(rainning), wet_grass]],
B = [[neg(wet_grass)], [wet_grass]],
C = [[]] ;

A = [[neg(green_grass)], [wet_grass], [neg(wet_grass), green_grass]],
B = [[neg(wet_grass)], [wet_grass]],
C = [[]] ;

A = [[neg(green_grass)], [wet_grass], [neg(wet_grass), green_grass]],
B = [[neg(green_grass)], [green_grass]],
C = [[]] ;

A = [[neg(green_grass)], [rainning], [neg(rainning), green_grass]],
B = [[neg(rainning)], [rainning]],
C = [[]] ;

A = [[neg(green_grass)], [rainning], [neg(rainning), green_grass]],
B = [[neg(green_grass)], [green_grass]],
C = [[]] ;
false.

这是在SWI Prolog上交叉发布的。谢谢你的解决方案,兄弟!我非常感激:)我想投票,但我还没有这个特权!
?- shrink([[1,2], [neg(1),3], [4,5,6], [neg(2),4]], S).
S = [[2, 3], [4, 5, 6], [neg(2), 4]] ;
S = [[1, 4], [neg(1), 3], [4, 5, 6]] ;
false.

?- shrink([[a,neg(b)], [a,b]], S).
S = [[a]] ;
false.

?- shrink([[rainning], [neg(rainning)]], S).
S = [[]] ;
false.

?- shrink([[rainning], [neg(rainning), wet_grass], [neg(wet_grass), green_grass]], S).
S = [[wet_grass], [neg(wet_grass), green_grass]] ;
S = [[rainning], [neg(rainning), green_grass]] ;
false.

?- shrink([[neg(green_grass)], [rainning], [neg(rainning), wet_grass], [neg(wet_grass), green_grass]], A), shrink(A, B), shrink(B, C).

A = [[neg(wet_grass)], [rainning], [neg(rainning), wet_grass]],
B = [[neg(rainning)], [rainning]],
C = [[]] ;

A = [[neg(wet_grass)], [rainning], [neg(rainning), wet_grass]],
B = [[neg(wet_grass)], [wet_grass]],
C = [[]] ;

A = [[neg(green_grass)], [wet_grass], [neg(wet_grass), green_grass]],
B = [[neg(wet_grass)], [wet_grass]],
C = [[]] ;

A = [[neg(green_grass)], [wet_grass], [neg(wet_grass), green_grass]],
B = [[neg(green_grass)], [green_grass]],
C = [[]] ;

A = [[neg(green_grass)], [rainning], [neg(rainning), green_grass]],
B = [[neg(rainning)], [rainning]],
C = [[]] ;

A = [[neg(green_grass)], [rainning], [neg(rainning), green_grass]],
B = [[neg(green_grass)], [green_grass]],
C = [[]] ;
false.