从具有条件的列表列表中创建列表

时间:2014-12-22 19:19:33

标签: list recursion prolog

我目前只对列表列表进行了递归。

在任何命令式语言中,任务都非常简单:迭代每个教授,迭代教授的课程列表,并获得与作为谓词参数给出的CourseNumber匹配的每个课程,以输出var CourseList。

我有一个简单的解决方案(其他只是失败,没有堆栈或返回空列表),但正如你所看到的,它只会检查课程列表的头部是否与cond匹配。

get_teaching_courses(CourseNumber, CourseList) :-
    findall(Course,
            (
              professor(_, [Course | _]),
              member(CourseNumber, Course)
            ),
            CourseList).

教授事实有下一个结构:

professor(Name, [ [CourseName , CourseNumber], .... ]).

我正在考虑对谓词进行谓词,但是我无法实现它(我猜想附加有问题)。

我已经开始学习prolog两天了,如果你能给我任何可以帮助我的帮助,建议或链接,我会很感激。

示例:

assertz(
        professor(
                    'Bob',
                    [
                        ['Math', 2],
                        ['PE', 3]
                    ]
                 )
       ).

解决方案:

get_teaching_courses(CourseNumber, CourseList) :-
    findall(CourseName,
            (
              professor(_, Course),
              member([CourseName, CourseNumber], Course)
            ),
            CourseList).
感谢@CapelliC和他的回答。

1 个答案:

答案 0 :(得分:1)

问题是在member / 2中应用了错误的模式匹配。试试

member([_,CourseNumber], Course)