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

SWI ProLog/ProbLog:检查列表中是否只有一个元素为真,prolog,Prolog,我试图在ProbLog(ProLog的扩展)中创建一个函数,检查是否只有一个输入是真的。作为输入,函数将使用变量列表作为参数。在这种情况下,XOR不够好,因为我使用的参数不止两个,并且我希望当且仅当列表中的一个元素为true时函数为true 例如: function([X|Xs) :- code that checks if only (exactly) one element in the list is true 我不知道Problog扩展,但也许您可以简单地计算真正的元素并检查计数是否为

我试图在ProbLog(ProLog的扩展)中创建一个函数,检查是否只有一个输入是真的。作为输入,函数将使用变量列表作为参数。在这种情况下,XOR不够好,因为我使用的参数不止两个,并且我希望当且仅当列表中的一个元素为true时函数为true

例如:

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

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

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).
然后,如果
H
不为真,则添加一个
L
不递增的情况,最后检查
N
是否为一

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).
这应该行得通

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

如何添加L不递增的情况并检查N是否为1?因为这正是问题所在。只需将其统一为一个:
N=1
。如果这失败了,那么谓词就失败了,因此列表中没有一个true元素。但是如果H不是true,那么如何添加L不递增的情况呢。不能使用if语句之类的语句,对吗?添加了代码。顺便说一下,请投票并接受有用的答案!啊,很好,谢谢你的代码:)但我还有一个问题:如果我想让函数检查这样的东西:countTrueElements(\+a,\+b,c),该怎么办。然后它返回零,而它应该返回1,因为只有c是真的。“找不到'memberchk/2'的子句,我可以将memberchk的代码添加到我的程序中吗,因为problog不知道这个函数。您可以使用member/2而不是memberchk。”