List Prolog列表操作辅助

List Prolog列表操作辅助,list,prolog,List,Prolog,我有一个序言作业的问题,我一直在努力,我相当坚持。基本问题是我有三个列表,每个列表都有包含短语和值的成员。我应该随机选择列表中的一个成员,打印短语,然后重复,直到我打印了至少两个列表中的短语,并且打印的短语的总值至少为9 到目前为止我所做的:我已经完成了几十次程序迭代,搜索了SWI文档以及Lean Prolog Now和stack overflow。在这个过程中,我了解到使用assert()向列表中添加项会导致后续运行中的损坏,所有变量都是本地变量,向空列表中添加单个项不会生成列表,但会在下一次

我有一个序言作业的问题,我一直在努力,我相当坚持。基本问题是我有三个列表,每个列表都有包含短语和值的成员。我应该随机选择列表中的一个成员,打印短语,然后重复,直到我打印了至少两个列表中的短语,并且打印的短语的总值至少为9

到目前为止我所做的:我已经完成了几十次程序迭代,搜索了SWI文档以及Lean Prolog Now和stack overflow。在这个过程中,我了解到使用assert()向列表中添加项会导致后续运行中的损坏,所有变量都是本地变量,向空列表中添加单个项不会生成列表,但会在下一次递归中生成有趣的错误消息,并且不能更改变量的值。 我的程序成功地做到了以下几点:从3个列表中随机选择一个。从该列表中随机获取一项。将所选项目中的短语和值放入不同的变量中,并打印它们

它的主要问题是我的列表操作似乎不起作用。行“append(Usedlist,Z,Usedlist3)”总是在代码的第二次迭代中失败,而不会抛出错误。此外,我相信成员(Z,Usedlist)没有像我在第二次迭代中随机得到一次重复那样正常工作。但是,我怀疑错误在于append没有正确地添加到列表中

相关代码(出于健康原因,压缩为1个列表)


让我们分阶段解决这个问题:

1.消除副作用并简化程序 首先,我将对您的计划进行以下直接更改:

  • I消除执行I/O的所有目标,因为这些目标只会妨碍我们对程序执行的推理
  • 我直接使用常量
    C
    ,而不是
    X是C
    ,其中
    C
    是一个常量,变量在代码的其余部分只使用一次
  • 因此,我们得到:

    main :- prologwhile(0, 0, 0, 0, ["Garbage data1", "More garbage data"]). prologwhile(Num, A, B, C, Usedlist) :- Num < 9 , F = [["time of day", 1], ["Season", 5], ["Yesterdays weather", 2], ["Month of last big storm", 2], ["Randomly generated riddle", 9], ["A captcha", 1], ['Current day', 6], ["Tomorrows date", 5]], random_member(Rand, F), nth0(1, Rand, Add), nth0(0, Rand, Z), ( member(Z, Usedlist) -> prologwhile(Num, A, B, C, Usedlist) ; append(Usedlist, Z, Usedlist3), Num3 is Num + Add, prologwhile(Num3, A, B, 1, Usedlist3) ). 从今以后,我假设
    短语/1
    与上面的代码片段中的定义相同,并且不附带它的定义

    2.找出失败的原因 现在,关于程序的实际推理开始了,因为我们有:

    ?- main. false. 我们现在得到:

    ?- main. append(["Garbage data1", "More garbage data"], "A captcha", _). append(["Garbage data1", "More garbage data"|"A captcha"], 'Current day', _). false. 它同样有效:

    ?- main. true . 示例查询:

    ?- solution(Ls). Ls = ["Randomly generated riddle", "Season"] ; false. ?溶液(Ls)。 Ls=[“随机生成的谜语”,“季节”]; 错。
    您还可以在构建列表时或在一个简单的附加步骤中轻松地扩展此功能,以报告总值。我把这当作练习。另外请注意,
    prologwhileisnotasytoread
    ,例如
    使用下划线将是

    @mat:非常好的指导性答案,+s(0)!由于我一直在做这方面的工作,你能给我解释一下最后两个步骤是如何工作的吗?我需要把A、B和C加进去,但如果整个事情都失败了,我就不能这样做。 $(Goal) :- portray_clause(Goal), Goal. prologwhile(Num, A, B, C, Usedlist) :- Num < 9 , phrases(Ps), random_member(Phrase-Value, Ps), ( member(Phrase, Usedlist) -> prologwhile(Num, A, B, C, Usedlist) ; $(append(Usedlist, Phrase, Usedlist3)), Num3 is Num + Value, prologwhile(Num3, A, B, 1, Usedlist3) ). ?- main. append(["Garbage data1", "More garbage data"], "A captcha", _). append(["Garbage data1", "More garbage data"|"A captcha"], 'Current day', _). false. ?- append(["Garbage data1", "More garbage data"|"A captcha"], 'Current day', _). false append(Usedlist, [Phrase], Usedlist3) Usedlist3 = [Phrase|Usedlist] prologwhile(Num, A, B, C, Usedlist) :- Num < 9 , phrases(Ps), random_member(Phrase-Value, Ps), ( member(Phrase, Usedlist) -> prologwhile(Num, A, B, C, Usedlist) ; Usedlist3 = [Phrase|Usedlist], Num3 is Num + Value, prologwhile(Num3, A, B, 1, Usedlist3) ). prologwhile(Num, A, B, C, Usedlist) :- Num < 9 , phrases(Ps), random_member(Phrase-Value, Ps), ( member(Phrase, Usedlist) -> prologwhile(Num, A, B, C, Usedlist) ; Num3 is Num + Value, prologwhile(Num3, A, B, 1, [Phrase|Usedlist]) ). ?- main. false. prologwhile(Num, _, _, _, [_,_|_]) :- Num >= 9. prologwhile(Num, _, _, _, [_,_|_]) :- Num >= 9. prologwhile(Num, A, B, C, Usedlist) :- Num < 9 , phrases(Ps), random_member(Phrase-Value, Ps), ( member(Phrase, Usedlist) -> prologwhile(Num, A, B, C, Usedlist) ; Num3 is Num + Value, prologwhile(Num3, A, B, 1, [Phrase|Usedlist]) ). ?- main. true . main :- prologwhile(0, ["Garbage data1", "More garbage data"]). prologwhile(Num, [_,_|_]) :- Num >= 9. prologwhile(Num, Usedlist) :- Num < 9 , phrases(Ps), random_member(Phrase-Value, Ps), ( member(Phrase, Usedlist) -> prologwhile(Num, Usedlist) ; Num3 is Num + Value, prologwhile(Num3, [Phrase|Usedlist]) ). ?- main. true . solution(List) :- prologwhile(0, [], List). prologwhile(Num, Ls, Ls) :- Num >= 9, Ls = [_,_|_]. prologwhile(Num, Ls0, Ls) :- Num < 9 , phrases(Ps), random_member(Phrase-Value, Ps), ( member(Phrase, Ls0) -> prologwhile(Num, Ls0, Ls) ; Num3 is Num + Value, prologwhile(Num3, [Phrase|Ls0], Ls) ). phrases(["time of day"-1, "Season"-5, "Yesterdays weather"-2, "Month of last big storm"-2, "Randomly generated riddle"-9, "A captcha"-1, 'Current day'-6, "Tomorrows date"-5]). ?- solution(Ls). Ls = ["Randomly generated riddle", "Season"] ; false.