1

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?

0 Answers0