List 序言将某些项目添加到列表中

List 序言将某些项目添加到列表中,list,prolog,accumulator,List,Prolog,Accumulator,尽管我仔细查看了类似问题的答案,但我还是无法理解为什么我的代码不起作用。我对Prolog太陌生了,无法正确地命名事物,但我希望你们能看到我想要表达的意思 我粗略地根据这个程序定义了一个时间表,并且正在努力获取Mike为给定结果教授的课程列表(下一步是声明只返回Mike和Phil teach 2都应该返回的结果,但我想完成它,以便我能够看到和理解发生了什么) 我想这应该很简单,但是addToList(List,C)谓词的任何组合都不会起作用。我知道有附加谓词,但我听说它效率很低,我想学习“原始”方

尽管我仔细查看了类似问题的答案,但我还是无法理解为什么我的代码不起作用。我对Prolog太陌生了,无法正确地命名事物,但我希望你们能看到我想要表达的意思

我粗略地根据这个程序定义了一个时间表,并且正在努力获取Mike为给定结果教授的课程列表(下一步是声明只返回Mike和Phil teach 2都应该返回的结果,但我想完成它,以便我能够看到和理解发生了什么)

我想这应该很简单,但是
addToList(List,C)
谓词的任何组合都不会起作用。我知道有附加谓词,但我听说它效率很低,我想学习“原始”方法。我不知道我尝试了多少变化,也不知道Prolog在这方面的工作方式,也不知道我在什么程度上出了问题——使用它有点像黑匣子一样神秘

        var program = 
        :- use_module(library(lists)). 
            prefers(may,a). 
            prefers(may,b). 
            prefers(may,c). 
            prefers(may,d). 

            prefers(bob,a). 
            prefers(bob,b).
            prefers(bob,c).

            prefers(pete,a). 
            prefers(pete,b).
            prefers(pete,c).
            prefers(pete,d).

            prefers(tom,a). 
            prefers(tom,b).
            prefers(tom,c).
            prefers(tom,d).

            teacher_pref(mike,a).
            teacher_pref(mike,b).
            teacher_pref(mike,c).

            teacher_pref(phil,b).
            teacher_pref(phil,c).
            teacher_pref(phil,d).

            addToList([C|List],C):- addToList(List,C).

            timetable([a,[C1,S1,T1],b,[C2,S2,T2],c,[C3,S3,T3],d,[C4,S4,T4]],List1):-

                teacher_pref(T1,C1),
                teacher_pref(T2,C2),
                teacher_pref(T3,C3),
                teacher_pref(T4,C4),

                prefers(S1,C1),
                prefers(S2,C2),
                S1\\=S2,
                prefers(S3,C3),
                S1\\=S3,
                S2\\=S3,
                prefers(S4,C4), 
                S1\\=S4,
                S2\\=S4,
                S3\\=S4,

                addToList(List1,C):-
                    teacher_pref(mike,C).

    session.consult( program );
    session.query('timetable([C1,[a,S1,T1],C2,[b,S2,T2],C3,[c,S3,T3,L3],C4,[d,S4,T4]],List1).')

如果我理解正确,您有:

teacher_pref(mike,a).
teacher_pref(mike,b).
teacher_pref(mike,c).
您想得到这些类的列表,这将是:

[a, b, c]
在Prolog中,我们有一些高阶谓词,它们适用于以下情况:

%        (What to find, the goal to call, all the results)
?- findall(Class, teacher_pref(mike, Class), Classes).
Classes = [a, b, c].
在中,他们在中的所有解决方案下

要使其成为更通用的谓词,请执行以下操作:

teacher_prefs(Teacher, Prefs) :-
    findall(Pref, teacher_pref(Teacher, Pref), Prefs).

Aja Hammerly有一个类似的任务:结对编程,你可能会发现它很有趣!谢谢,最后我确实使用了您建议的
findall
,传递了整个谓词。但是现在,最快的方法是创建
[T1,L1],[T2,L2],…
的列表,其中
[T1,L1]\=[T2,L2]…
,并根据T是一个给定名称的位置计数。伯爵真的是我想要的。