Prolog - 如何检查列表的元素是否出现在固定格式的嵌套列表中
Prolog - how to check if an element of a list occurs in a nested list of fix format
我遇到了以下问题。我有一个列表 'A' 让我们称它为“假设”,并使用谓词 ass(A,P)
我想检查一下,如果所有这些假设确实以某种形式出现在变量证明中。
例如,如果我调用:
?- 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).
我现在的问题是,maplist 会尝试检查每一对 [A,P,I]
,如果它找到了一些,其中 succ(A,P,I)
是假的 ass(A,P)
也是假的。
现在我有两个问题:
- 他们能解决我的问题吗?
- 他们是一种固定谓词
succ(A,P,I)
中的参数 P 和 I 的方法,因此有可能例如仅在 [[I1],I1,a,'A','']
时进行成员检查,例如是 I 中某些 I1 的列表 P 的成员。
感谢您的帮助,
马丁
你可以很简单地写:
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
我遇到了以下问题。我有一个列表 'A' 让我们称它为“假设”,并使用谓词 ass(A,P)
我想检查一下,如果所有这些假设确实以某种形式出现在变量证明中。
例如,如果我调用:
?- 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).
我现在的问题是,maplist 会尝试检查每一对 [A,P,I]
,如果它找到了一些,其中 succ(A,P,I)
是假的 ass(A,P)
也是假的。
现在我有两个问题:
- 他们能解决我的问题吗?
- 他们是一种固定谓词
succ(A,P,I)
中的参数 P 和 I 的方法,因此有可能例如仅在[[I1],I1,a,'A','']
时进行成员检查,例如是 I 中某些 I1 的列表 P 的成员。
感谢您的帮助, 马丁
你可以很简单地写:
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