PROLOG存储先前的输出/输入并基于旧输出生成新输入

时间:2018-04-14 00:28:26

标签: prolog

我想做的是:

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;

2 个答案:

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