【发布时间】:2017-05-05 14:50:35
【问题描述】:
我有一个 prolog 作业问题,我一直在努力解决这个问题。基本问题是我有三个列表,每个列表都有包含一个短语和一个值的成员。我应该随机选择列表中的一个成员,打印短语,然后重复,直到我从至少两个列表中打印出短语,并且打印的短语的总值至少为 9。
到目前为止我所做的:我已经完成了程序的几十次迭代,并搜索了 SWI 文档以及 Lean Prolog Now 和堆栈溢出。在此过程中,我了解到使用 assert() 将项目添加到列表会导致后续运行损坏,所有变量都是本地的,将单个项目附加到空列表不会导致列表但确实会导致在有趣的错误消息中,下一次递归,并且你不能改变变量的值。 我的程序成功地执行了以下操作:随机选择 3 个列表之一。从该列表中随机抓取一个项目。将所选项目中的短语和值放入不同的变量中,并打印出来。
它的主要问题是我的列表操作似乎不起作用。 “append(Usedlist, Z, Usedlist3)”行在代码的第二次迭代中总是失败而不会引发错误。此外,我认为 member(Z, Usedlist) 不能正常工作,因为我在第二次迭代中随机重复它不能正常工作。但是,我怀疑错误在于未正确添加到列表中。
相关代码(出于理智原因,精简为 1 个列表)
main :-
A is 0,
B is 0,
C is 0,
Num is 0,
Usedlist = ["Garbage data1", "More garbage data"],
prologwhile(Num, A, B, C, Usedlist).
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),
writeln(Rand),
nth0(0, Rand, Z),
writeln(Usedlist),
( member(Z, Usedlist) ->
writeln("Test5"),
prologwhile(Num, A, B, C, Usedlist)
; writeln(Rand),
writeln(Add),
writeln("Test6"),
append(Usedlist, Z, Usedlist3),
writeln(Z),
C3 is 1,
Num3 is Num + Add,
writeln(Num3),
prologwhile(Num3, A, B, C3, Usedlist3)
)
样本输出
[Tomorrows date,5]
[Garbage data1,More garbage data]
[Tomorrows date,5]
5
Test6
Tomorrows date
5
[time of day,1]
[Garbage data1,More garbage data|Tomorrows date]
[time of day,1]
1
Test6
false.
【问题讨论】: