2016-09-10 79 views
0

当前大学生在这里,并且必须在本学期学习Prolog。想要在我们真正进入任何任务之前先弄到手,然后学习,然后我失去了大声笑。Prolog初学者--Macbook

我创建了一个程序的一个项目,它是专门为电影

我有事情,如我movie.pl文件:

%acted_in(person,movie). 
acted_in(brad_pitt,babel). 
acted_in(cate_blanchette,babel). 
acted_in(sharlto_copley,district_9). 
acted_in(david_james,district_9). 

%directed(person,movie). 
directed(alejandro_inarritu,babel). 
directed(neill_blomkamp,district_9). 

%released(movie,year). 
released(babel,2006). 
released(district_9,2009). 

这些都只是一些那些我有在那里。现在我的老师已经有了一些东西,因为他建议我们继续前进并尝试我们自己的程序。他继续向我们提供了一个makefile,该文件应该可以用于更改EXE =电影所需的一切。

我失去的部分在main.pl上。假设我有多个不同的问题需要投入,我将如何添加它们?我只是在前面的print_query_false下添加一个带有新问题的writeln?

%main.pl 
:- [movie]. 
print_query_true(Q) :- 
    forall(Q, writeln(true:Q)). 

print_query_false(Q) :- 
    forall(\+ Q, writeln(false:Q)). 

main :- 
    nl 
    writeln("1. Did Leonardo DiCaprio act in Babel?"), 
    print_query_true(acted_in(leonardo_dicaprio,babel)), 
    print_query_false(acted_in(leonardo_dicaprio,babel)), 
    nl, 
    halt. 

我最后一个问题是,当我尝试运行swipl时,它会通过并打开程序。但是当我输入[电影]。它只是说实话,并没有表明这是说编译或任何类型的。

+3

你应该改变你的问题的标题。 “Prolog初学者”没有描述这个问题,而且你使用MacBook(如果这就是你的标题中的含义)这一事实看起来与问题无关。 – lurker

回答

0

我丢失的部分位于main.pl.假设我有多个不同的问题需要投入,我将如何添加它们?我只是在前面的print_query_false下添加一个带有新问题的writeln?

是的,比如说:

main :- 
    nl, 
    format("1. Did Leonardo DiCaprio act in Babel?"), 
    nl, 
    print_query_true(acted_in(leonardo_dicaprio,babel)), 
    print_query_false(acted_in(leonardo_dicaprio,babel)), 
    nl, 
    format("2. Was babel released in 2006?"), 
    nl, 
    print_query_true(released(babel, 2006)), 
    print_query_false(released(babel, 2006)), 
    nl, 
    format("3. Did anyone act in both Click and The Aviator?"), 
    nl, 
    print_query_true((acted_in(X, click), acted_in(X, the_aviator))), 
    print_query_false((acted_in(X, click), acted_in(X, the_aviator))), 
    nl, 
    format("4. Did sharlto_copley and david_james both act in district_9?"), 
    nl, 
    print_query_true((acted_in(sharlto_copley, district_9), acted_in(david_james, district_9))), 
    print_query_false((acted_in(sharlto_copley, district_9), acted_in(david_james, district_9))), 
    nl, 
    format("5. Was there any two movies released in 2006 and 2009?"), 
    nl, 
    print_query_true((released(X, 2006), released(Y, 2009))), 
    print_query_false((released(X, 2006), released(Y, 2009))), 
    nl, 
    format("6. What actors acted in babel or district 9?"), 
    nl, 
    print_query_true((acted_in(X, babel) ; acted_in(X, district_9))), 
    print_query_false((acted_in(X, babel) ; acted_in(X, district_9))), 
    nl, 
    format("6. What actors played in babel but not in district 9?"), 
    nl, 
    print_query_true((acted_in(X, babel), \+ acted_in(X, district_9))), 
    print_query_false((acted_in(X, babel), \+ acted_in(X, district_9))), 
    nl, 
    halt. 

我改变writelnformat得到输出正确格式的字符串。测试运行:

?- [main]. 
% movie compiled 0.00 sec, 9 clauses 
% main compiled 0.00 sec, 15 clauses 
true. 

?- main. 

1. Did Leonardo DiCaprio act in Babel? 
false:acted_in(leonardo_dicaprio,babel) 

2. Was babel released in 2006? 
true:released(babel,2006) 

3. Did anyone act in both Click and The Aviator? 
false: (acted_in(_G1551,click),acted_in(_G1551,the_aviator)) 

4. Did sharlto_copley and david_james both act in district_9? 
true: (acted_in(sharlto_copley,district_9),acted_in(david_james,district_9)) 

5. Was there any two movies released in 2006 and 2009? 
true: (released(babel,2006),released(district_9,2009)) 

6. What actors acted in babel or district 9? 
true: (acted_in(brad_pitt,babel);acted_in(brad_pitt,district_9)) 
true: (acted_in(cate_blanchette,babel);acted_in(cate_blanchette,district_9)) 
true: (acted_in(sharlto_copley,babel);acted_in(sharlto_copley,district_9)) 
true: (acted_in(david_james,babel);acted_in(david_james,district_9)) 

6. What actors played in babel but not in district 9? 
true: (acted_in(brad_pitt,babel),\+acted_in(brad_pitt,district_9)) 
true: (acted_in(cate_blanchette,babel),\+acted_in(cate_blanchette,district_9)) 

SWI-Prolog的有真棒文件,所以我建议你检查了,能够完全理解他们的谓词:

最后一个问题我已经是当我尝试运行swipl它去通过并打开程序。但是当我输入[电影]。它只是说实话,并没有表明这是说编译或任何类型的。

确保您位于拥有源文件的正确目录中。

SWI-Prolog v6.6。4输出:

?- [movie]. 
% movie compiled 0.00 sec, 9 clauses 
true. 
+1

非常感谢你的帮助。现在说我想比较两种不同的东西,比如一个角色在两部单独的电影中演出。我将如何做到这一点? 格式( “3.的确在点击和飞行家?人的行为”),NL, print_query_true((acted_in(X,单击),(acted_in(X,the_aviator)))), print_query_false(( acted_in(X,Click),(acted_in(X,the_aviator)))), nl, – c0212