I am running prolog in python on jupyter notebook. I am passing some info in prolog from a csv file with the following code:
def clean_text(text):
text = text.replace(u'\xa0', u'')
text = text.replace(u"'", u'')
text = text.replace(u'"', u'')
return text
#create World
prolog = Prolog()
prolog.query('make')
prolog.consult("file1.pl")
literals = []
movie_score = {}
for row in data.itertuples(index=True, name='Pandas'):
movie_title = clean_text(getattr(row, 'movie_title'))
director = clean_text(getattr(row, 'director_name'))
movie_score[movie_title] = 0
if movie_title != "UNK":
if director != "UNK":
literals.append("director('"+ movie_title +"','" + director + "')")
for genre in getattr(row, 'genres').split("|"):
literals.append("genre('"+ movie_title +"','"+ genre +"')")
for plot_keywords in clean_text(getattr(row, 'plot_keywords')):
literals.append("plot('"+ movie_title +"','"+ plot_keywords +"')")
for language in clean_text(getattr(row, 'language')):
literals.append("language('"+ movie_title +"','"+ language +"')")
for actor1 in clean_text(getattr(row, 'actor_1_name')):
literals.append("actor1('"+ movie_title +"','"+ actor1 +"')")
for actor2 in clean_text(getattr(row, 'actor_2_name')):
literals.append("actor2('"+ movie_title +"','"+ actor2 +"')")
for actor3 in clean_text(getattr(row, 'actor_3_name')):
literals.append("actor1('"+ movie_title +"','"+ actor3 +"')")
for color in (getattr(row, 'color')):
literals.append("color('"+ movie_title +"','"+ color +"')")
literals.sort()
for literal in literals:
prolog.assertz(literal)
#for solk in prolog.query("common_director('Wes Craven',Y)"):
# print("Wes Craven", "is the director of movie ", solk["Y"])
#for soll in prolog.query("medium_common_subject('Adventure','Animation','Comedy',Ans2)"):
# print("The Movie is ", soll)
#for solm in prolog.query("small_common_subject('Adventure',Ans3)"):
# print("The Movie is ", solm["Ans3"])
for solt in prolog.query("medium_common_plot('autobot','decepticon','machine',Ans4)"):
print("The Movie is: ",solt["Ans4"])
#for soly in prolog.query("large_same_actors('Orlando Bloom','Johnny Depp','Jack Davenport',Ans7)"):
# print("The Movie is ", soly["Ans7"])
for solz in prolog.query("color('Black and White',Ans11)"):
print("The Movie is ", solz["Ans11"])
#for solx in prolog.query("same_language(English,Ans10)"):
# print("The Movie 2 is ", soln["Ans10"])
My prolog file looks like this: (The point of the first three questions is to find movies that have four,three,one genre the same. If I wanted them to have exactly four,three,one how could I do it?)
large_common_subject(Genre1,Genre2,Genre3,Genre4,Ans1):- genre(Ans1,Genre1),genre(Ans1,Genre2),genre(Ans1,Genre3),genre(Ans1,Genre4). %1b-1
medium_common_subject(Genre1,Genre2,Genre3,Ans2):-genre(Ans2,Genre1),genre(Ans2,Genre2),genre(Ans2,Genre3). %1b-2
small_common_subject(Genre,Ans3):- genre(Ans3,Genre). %1b-3
common_director(Director,Ans4):- director(Ans4,Director). %1b-4
large_common_plot(Plot1,Plot2,Plot3,Plot4,Ans5):-
plot(Ans5,Plot1),plot(Ans5,Plot2),plot(Ans5,Plot3),plot(Ans5,Plot4). %1b-5
medium_common_plot(Plot1,Plot2,Plot3,Ans6):-
plot(Ans6,Plot1),plot(Ans6,Plot2),plot(Ans6,Plot3). %1b-6
large_same_actors(Actor1,Actor2,Actor3,Ans7):-
actor1(Ans7,Actor1),actor2(Ans7,Actor2),actor3(Ans7,Actor3). %1b-7
medium_same_actors(Actor1,Actor2,Ans8):-
actor1(Ans8,Actor1),actor2(Ans8,Actor2). %1b-8
small_same_actors(Actor1,Actor2,Actor3,Ans9):-
actor1(Ans9,Actor1). %1b-9
same_language(Language,Ans10):- language(Ans10,Language). %1b-10
find_color(Color,Ans11):- color(Ans11,Color).
Most of my queries return multiple times the same movie and some queries don't return anything at all, even if they are supposed to print something. How can I stop the duplicates? and why are there duplicates appearing anyways?