我想做的是:
getDiffAnswer / 5
如果R是包含问题Q的候选答案CR的列表中的新响应,则getDiffAnswer(Q,PQ,PR,CR,R)成立。
Q是一个问题。
PQ是先前问题的列表
PR是先前回复的列表
CR是可能的回复列表
R是不同的回复
预期产出:
1. ?- getDiffAnswer([what,is,X],
[],[],
[1,2,3],R).
R = 1;
false.
2. ?- getDiffAnswer([what,is,X],
[[what,is,X]],
[[1]],
[1,2,3],R).
R = 2 ;
false.
3. ?- getDiffAnswer([what,is,X],
[[what,is,X],[what,is,X]],
[[1,2]],
[1,2,3],R)
R = 3 ;
4. ?- getDiffAnswer([what,is,X],
[[what,is,X],[what,is,X],[what,is,X]],
[[1,2,3]],
[1,2,3],R)
false;
答案 0 :(得分:1)
假设所有问题始终相同,那么这就实现了我相信的规范:
getDiffAnswer(_,_,PR,CR,R) :-
append(PR,[R|_],CR).
您的示例:
?- getDiffAnswer([what,is,'X'],[],[],[1,2,3],R).
R = 1.
?- getDiffAnswer([what,is,'X'],[[what,is,'X']],[1],[1,2,3],R).
R = 2.
?- getDiffAnswer([what,is,'X'],[[what,is,'X'],[what,is,'X']],[1,2],[1,2,3],R).
R = 3.
?- getDiffAnswer([what,is,'X'],[[what,is,'X'],[what,is,'X'],[what,is,'X']],[1,2,3],[1,2,3],R).
false.
答案 1 :(得分:0)
这是编辑的答案,选择的第一种方法是错误的。这种方法是进行递归并检查另一个问题是否与我们的问题相同,如果我们正在收集这些问题的答案。最后我们知道我们的答案R将是CR集的成员,但它也不会成为收集集的成员。
getDiffAnswer(Q,PQ,PR,CR,R) :-
possibleAnswers(Q,PQ,PR,[],Rs),
member(R,CR),not(member(R,Rs)).
possibleAnswers(_,[],_,RS,RS).
possibleAnswers(Q,[H|L],[H1|L1],Rs,Rs2):-
(Q = H -> append([H1],Rs,Rs3)),
possibleAnswers(Q,L,L1,Rs3,Rs2).
Rs只是已经用于当前问题的所有答案的集合。
我将PR视为答案列表,因此不是[[1,2,3]]
而是[1,2,3]
。