PROLOG存储以前的输出/输入,并根据旧的输出/输入生成新的输入
我想做的是: getDiffAnswer/5 getDiffAnswer(Q,PQ,PR,CR,R)如果R是包含候选答案的列表中针对问题Q的CR的新响应,则保持有效 Q是一个问题 PQ是先前问题的列表 PR是以前答复的列表 CR是可能的答复列表 R是不同的回答 预期产出:PROLOG存储以前的输出/输入,并根据旧的输出/输入生成新的输入,prolog,Prolog,我想做的是: getDiffAnswer/5 getDiffAnswer(Q,PQ,PR,CR,R)如果R是包含候选答案的列表中针对问题Q的CR的新响应,则保持有效 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. ?- 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;
这里是编辑后的答案,选择的第一种方法是错误的。这种方法是进行递归并检查其他问题是否与我们的问题相等,如果相等,我们将收集这些问题的答案。最后我们知道我们的答案R将是集合CR的成员,但它也不会是集合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]
假设所有问题都是相同的,那么我相信这将实现您的规范:
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.
如果PR(第三个参数)的顺序不正确,getDiffAnswer([what,is,'X'],[what,is,'X']],[2],[1,2,3],R)将失败。错。@Alejandro:当然可以。您应该指定它们可以是任何顺序。