首页 > 解决方案 > 根据一些规范在 Prolog 中创建一个列表

问题描述

我正在做一个附带项目,我正在尝试创建一个 Prolog 函数来制作原子列表,但它必须确保一些原子排在其他原子之前。本质上是必须完成的任务列表,但其中一些任务是其他任务的先决条件。

例如:

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

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

然而,我什至一开始就创建了一个可以列出所有任务的列表,更不用说先决条件先于其他任务了。

任何指导都会很棒,我当然不会要求任何人为我写这个我只需要一个通用的工作示例或其他东西来让我开始。我搜索了一个试图修改这么多东西的尝试,我只是无法再让任何东西工作了。

预先感谢您,如果这个问题看起来含糊不清或无益,我深表歉意。我真的被困住了。

标签: prolog

解决方案


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

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]

推荐阅读