SWI ProLog / ProbLog:检查列表中的一个元素是否为真

时间:2016-03-15 13:38:26

标签: prolog

我试图在ProbLog(ProLog的扩展名)中创建一个函数来检查其中一个输入是否为True。作为输入,该函数将变量列表作为参数。在这种情况下,XOR不够好,因为我正在处理两个以上的参数,当且仅当列表中的一个元素为True时,我希望函数为真。

例如:

function([X|Xs) :- code that checks if only (exactly) one element in the list is true

2 个答案:

答案 0 :(得分:2)

我不知道Problog扩展,但也许您可以简单地计算真实元素并检查计数是否为1?也许使用this作为起点:

length(List, N) :-
  length(List, 0, N).

length([], N, N).       % Second argument is the accumulator.
length([H|T], L, N) :-
    L1 is L + 1,
    length(T, L1, N).

然后,如果L不为真,则会添加H未递增的情况,最后检查N是否为1。

hasOneTrueElement(List) :-
    countTrueElements(List, 1).
countTrueElements(List, N) :-
    countTrueElements(List, 0, N).
countTrueElements([], N, N).
countTrueElements([H|T], L, N) :-
    call(H),
    L1 is L + 1,
    countTrueElements(T, L1, N).
countTrueElements([H|T], L, N) :-
    \+ H,
    countTrueElements(T, L, N).

答案 1 :(得分:1)

这应该有效

list_unique(List, Unique) :-
  select(Unique, List, Rest), \+ memberchk(Unique, Rest).