簡體   English   中英

如何列出 Prolog 查詢,然后以編程方式打印每個查詢及其結果?

[英]How to you list Prolog queries and then print each query and its result(s) programmatically?

我有以下名為movies.pl的文件:

acted_in('Brad Pitt', 'Babel').
acted_in('Cate Blanchett', 'Babel').
acted_in('Sharlto Copley', 'District 9').
acted_in('Sharlto Copley', 'Elysium').
acted_in('Matt Damon', 'Elysium').
acted_in('Sharlto Copley', 'Europa Report').
acted_in('Leonardo DiCaprio', 'Don\'t Look Up').
acted_in('Jonah Hill', 'Don\'t Look Up').
acted_in('Cate Blanchett', 'Don\t Look Up').
acted_in('Adam Sandler', 'Click').
acted_in('Christopher Walken', 'Click').
acted_in('Kate Beckinsale', 'Click').
acted_in('Jonah Hill', 'Click').
acted_in('Leonardo DiCaprio', 'The Aviator').
acted_in('Cate Blanchett', 'The Aviator').
acted_in('Kate Beckinsale', 'The Aviator').
acted_in('Brad Pitt', 'Inglourious Basterds').
acted_in('Melanie Laurent', 'Inglourious Basterds').
acted_in('Michael Fassbender', 'Inglourious Basterds').
acted_in('Diane Kruger', 'Inglourious Basterds').

directed('Alejandro Gonzalez Inarritu', 'Babel').
directed('Neill Blomkamp', 'District 9').
directed('Neill Blomkamp', 'Elysium').
directed('Sebastian Cordero', 'Europa Report').
directed('Adam McKay', 'Don\'t Look Up').
directed('Frank Coraci', 'Click').
directed('Martin Scorsese', 'The Aviator').
directed('Quentin Tarantino', 'Inglourious Basterds').

released('Babel', 2006).
released('District 9', 2009).
released('Europa Report', 2013).
released('Don\'t Look Up', 2021).
released('Click', 2006).
released('The Aviator', 2004).
released('Inglourious Basterds', 2009).

我想自動運行一堆查詢,而無需交互地輸入查詢。 當以交互方式輸入時,一些示例查詢如下所示:

?- released(Movie, 2009), directed(Director, Movie).
Movie = 'District 9',
Director = 'Neill Blomkamp' ;
Movie = 'Inglourious Basterds',
Director = 'Quentin Tarantino'.

?- acted_in(Actor, 'Click'), acted_in(Actor, 'The Aviator').
Actor = 'Kate Beckinsale' ;
false.

?- directed(Director_1, Movie), directed(Director_2, Movie), \+ Director_1 = Director_2.
false.

由於這些是交互式運行的,我知道什么查詢被問到什么結果。 當我以編程方式運行它們時,我基本上想要完全相同的 output 但生成每個結果的查詢打印在它上面。 搜索后,我已經看到了有關initialization/1指令的一些內容,但我不確定如何列出查詢,然后將它們與結果一起打印出來。 我仍然是 Prolog 的新手,並且想繼續閱讀我正在閱讀的當前書籍,而不會因這種轉移而陷入困境,盡管轉移將有助於閱讀本書。 我只是想要一個我可以實現的簡單的東西,這樣我就可以在加載文件時運行一個查詢列表,查詢本身被打印出來,然后是它們的結果。

謝謝!

實現此目的的一種方法是定義這兩個輔助方法:

% Obtain one possible substitution ("Result") for Query
get_result(Query, Result) :-
    term_string(Term, Query, [variable_names(VariableNames)]),
    Term,
    Result = VariableNames.

% Find and print all substitutions for Query, fail if empty
log_query(Query) :-
    format("Evaluating: ~w ~n", [Query]),
    findall(Result, get_result(Query, Result), Results),
    not(length(Results,0)),
    writeln(Results).

有了這個,我們可以定義一個謂詞來運行我們的查詢:

main :-
    log_query("released(Movie, 2009), directed(Director, Movie)."),
    log_query("acted_in(Actor, 'Click'), acted_in(Actor, 'The Aviator')."),
    log_query("directed(Director_1, Movie), directed(Director_2, Movie), \\+ Director_1 = Director_2.").

然后添加此子句以在初始化時運行此謂詞:

:- initialization main.

這將在 session 的開頭記錄以下內容:

Evaluating: released(Movie, 2009), directed(Director, Movie). 
[[Movie=District 9,Director=Neill Blomkamp],[Movie=Inglourious Basterds,Director=Quentin Tarantino]]
Evaluating: acted_in(Actor, 'Click'), acted_in(Actor, 'The Aviator'). 
[[Actor=Kate Beckinsale]]
Evaluating: directed(Director_1, Movie), directed(Director_2, Movie), \+ Director_1 = Director_2. 
Warning: Initialization goal failed

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM