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