【发布时间】:2021-08-27 11:22:32
【问题描述】:
我有以下问题。我有一个列表“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).
我现在的问题是,该 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(A,P) :- member(X1,A), member([[I], I, X1, 'A', ''],P) .问题是, ?- ass([a, b],P) 为 P 提供了一个无限列表,其中包含元素,例如[[_1396],_1396,一个,'A','']。我的愿望是列表 [[_1396], _1396, a, 'A', ''], [[_1397], _1397, b, 'A', ''] 的两个元素。