根据一些规范在Prolog中创建列表

时间:2019-11-25 05:31:45

标签: prolog

我正在做一个副项目,尝试创建一个列出原子列表的Prolog函数,但是必须确保某些原子先于其他原子。本质上是必须完成的任务列表,但是某些任务是其他任务的先决条件。

例如:

task(brushteeth).
task(usemouthwash).
task(gotowork).

prereq(usemouthwash, brushteeth).
%where brush teeth must be done prior to using mouthwash

但是,我什至很难创建一个列表,该列表可以列出所有任务,更不用说先决条件要先于其他任务了。

任何指导都会很棒,我当然不会要求任何人为我写这篇文章,我只需要一个通用的工作示例或使我入门的东西。我搜索了一个试图修改太多东西的尝试,以至于我什么都无法工作了。

在此先感谢您,如果这个问题含糊或无益,我深表歉意。我真的被卡住了。

1 个答案:

答案 0 :(得分:2)

您可以从基本情况开始思考,因为您更有可能使用递归来编写谓词:

create_list([]). %zero element list is accepted, same for one element below:
create_list([X]):- task(X).
create_list([X,Y|Rest]):- prereq(X,Y), create_list([Y|Rest]).

最后是固定长度的列表:

create_list_len(L,N):- length(L,N), create_list(L).

具有事实的示例:

task(brushteeth).
task(usemouthwash).
task(gotowork).

prereq(usemouthwash, brushteeth).
prereq(gotowork, usemouthwash).

create_list(L).
L = []
L = [brushteeth]
L = [usemouthwash]
L = [gotowork]
L = [usemouthwash, brushteeth]
L = [gotowork, usemouthwash]
L = [gotowork, usemouthwash, brushteeth]
false

create_list_len(L,3).
L = [gotowork, usemouthwash, brushteeth]