PROLOG存储以前的输出/输入,并根据旧的输出/输入生成新的输入

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]]

我想做的是:

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]],
[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:当然可以。您应该指定它们可以是任何顺序。