Prolog -如何检查列表的元素是否出现在固定格式的嵌套列表中



我有以下问题。我有一个列表a,我们称之为"假设"对于谓词ass(A,P),我想检查是否所有这些假设都以某种形式出现在变量Proof中。

例如,我调用:

?- ass([a, b], [[[1], 1, a, 'A', ''], [[2], 2, a->b, 'A',''], [[3], 3, b, 'A', '']]).

应该给出值true,因为[[1],1,a, 'a', "]]和[[3],3,b, 'a', "]]是p中赋值给列表a中的'a'和'b'的元素。

?- ass([a,b],P).

。应交付P=[[[1], 1, a, 'A', ''], [[2], 2, b, 'A','']]

我试着用下面的代码来解决它:

do_list(N, L):- 
findall(Num, between(1, N, Num), L).
succ(A, P, I) :- [[I], I, A, 'A', ''] == P.
ass(A, P) :- length(A, L1), length(P,L2), L3 is max(L1,L2), do_list(L3, I), maplist(succ, A, P, I).

我现在的问题是,mapplist试图检查每一对[A,P,I],如果它发现一些,其中succ(A,P,I)是假的ass(A,P)也是假的。

现在我有两个问题:

  1. 这是解决我问题的方法吗?
  2. 是他们在谓词succ(A,P,I)中修复参数P和I的一种方法,因此,如果[[I1],I1,a,'A','']是I中某些I1的列表P的成员,则可以简单地进行membercheck。

谢谢你的帮助,马丁

很简单,你可以这样写:

ass(E,L,E1):-
maplist(ass_(L),E,E1).
ass_(L,E,E1):-
member(E1,L),
member(E,E1).
?- ass([a, b], [[[1], 1, a, 'A', ''], [[2], 2, a->b, 'A',''], [[3], 3, b, 'A', '']],L).
L = [[[1], 1, a, 'A', ''], [[3], 3, b, 'A', '']]
false

最新更新