【问题标题】:Prolog - how to check if an element of a list occurs in a nested list of fix formatProlog - 如何检查列表的元素是否出现在修复格式的嵌套列表中
【发布时间】: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) 也是假。

现在我有两个问题:

  1. 他们是解决我问题的方法吗?
  2. 是他们在谓词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', ''] 的两个元素。

标签: list prolog


【解决方案1】:

你可以很简单地写:

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

【讨论】:

    猜你喜欢
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 2013-03-01
    • 2015-03-20
    相关资源
    最近更新 更多