我有以下问题。我有一个列表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)
也是假的。
现在我有两个问题:
- 这是解决我问题的方法吗?
- 是他们在谓词
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