我试图在ProbLog(ProLog的扩展名)中创建一个函数来检查其中一个输入是否为True。作为输入,该函数将变量列表作为参数。在这种情况下,XOR不够好,因为我正在处理两个以上的参数,当且仅当列表中的一个元素为True时,我希望函数为真。
例如:
function([X|Xs) :- code that checks if only (exactly) one element in the list is true
答案 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).