【问题标题】:I want to make this prolog file a stand-alone EXE file我想让这个 prolog 文件成为一个独立的 EXE 文件
【发布时间】:2017-06-10 06:01:32
【问题描述】:

我是 prolog 的新手,我已经编写了这段代码,但我想让这个 prolog 文件成为一个独立的 EXE 文件,但我不知道如何去做。我正在使用 swi-prolog 来查阅文件。我需要使用 swi-prolog 使该程序可执行的分步教程。我将其保存为 'computer.pl' 这是下面的代码。

main :- identify.

identify :-
  write('Welcome to Micro-Computer troubleshooting'),
  nl,
  write('Please do not forget to type all your answers with a period(.) in the end'),
  nl,
  retractall(known(_,_,_)),            % clear stored information
  diagnosis(X),
  nl,
  write('The problem is:  '),
  nl,
  writeListByLine(X).
identify :-
  nl,
  write('I can not identify the problem').

writeListByLine([]).
writeListByLine([H|T]) :-                 % write answers in newline
  write(H),
  nl,
  writeListByLine(T).

%%%%%%%%%%%%%%%%%%%%%%%% Audio Sound Card not detected %%%%%%%%%%%%%%%%%%

diagnosis(['damaged sound card']) :-
  problem('Audio Sound Card not detected'),
  nl,
  write('>> remove damaged sound card and replace with a new sound card <<'),
  nl,
  question_1('is the sound card working?').

diagnosis(['sound card not installed']) :-
 problem('Audio Sound Card not detected'),
 nl,
 write('>> install new sound card <<'),
 nl,
 question_2('can your computer detect the new sound card?').

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Audio Driver Warning %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

diagnosis(['driver conflict']) :-
  problem('Audio Driver Warning'),
  nl,
  write('>> uninstall previous audio drivers <<'),
  nl,
  question_1('is the audio driver working now?').

diagnosis(['incompatable audio driver']) :-
 problem('Audio Driver Warning'),
 nl,
 write('>> install the appropriate audio driver for your computer <<'),
 nl,
 question_2('is your computer still showing driver Warning?').

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Scratchy Sound %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

diagnosis(['signal interference']) :-
  problem('Scratchy Sound'),
  nl,
  write('>> stay away from radio frequency sources <<'),
  nl,
  question_1('is the sound working fine now?').

diagnosis(['bad speaker']) :-
  problem('Scratchy Sound'),
  nl,
  write(' >> connect a ear phone to the computer <<'),
  nl,
  question_2('is the ear phone giving scratchy sound also?').

diagnosis(['bad speaker']) :-
  problem('Scratchy Sound'),
  nl,
  write('>> replace speaker <<'),
  nl,
  question_3('it should be working fine now ?').

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Num lock stays off at startup %%%%%%%%%%%%%%%%%%%%%%%%%

diagnosis(['num lock shut off in BIOS']) :-
  problem('Num lock stays off at startup'),
  nl,
  write('>> turn on num lock in BIOS <<'),
  nl,
  question_1('does num lock on at startup?').

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Invalid Drive Specification Error %%%%%%%%%%%%%%%%%%%%%%%%%

diagnosis(['drive not yet formatted']) :-
  problem('Invalid Drive Specification Error'),
  nl,
  write('>> format your drive <<'),
  nl,
  question_1('does your drive shows the drive letter?').

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Mouse Pointer Jerks Onscreen %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

diagnosis(['mouse ball or rollers are dirty']) :-
  problem('Mouse Pointer Jerks Onscreen'),
  nl,
  write('>> clean mouse mechanism <<'),
  nl,
  question_1('does the mouse still jerks on onscreen?').

diagnosis(['damaged mouse']) :-
 problem('Mouse Pointer Jerks Onscreen'),
 nl,
 write('>> connect the mouse to another computer <<'),
 nl,
 write('>> replace mouse <<'),
 nl,
 question_2('does the mouse still jerks on onscreen?').

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%% System Cant find my Hard Drive %%%%%%%%%%%%%%%%%%%%%%%

diagnosis(['boot priority error']) :-
 problem('System Cant find my Hard Drive'),
 nl,
 write('>> set hard drive as the first booting device <<'),
 nl,
 question_1('does your hard drive now load at startup?').

diagnosis(['crashed hard drive']) :-
 problem('System Cant find my Hard drive'),
 nl,
 write('>> insert another hard drive to your computer,if the hard drive load at startup then previous hard drive has crashed <<'),
 nl,
 question_2('does your system recognize the hard drive?').

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%% Random shutdown when working on computer %%%%%%%%%%%%%%%

diagnosis(['over heating']) :-
 problem('Random shutdown when working on computer'),
 question_1('does your computer get very hot when working?').

diagnosis(['dusty vent']) :-
 problem('Random shutdown when working on computer'),
 question_2('is their blockage or dust in the system vent?').

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%% computer freezes randomly %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

diagnosis(['hard drive is full']) :-
 problem('computer freezes randomly'),
 question_1('is your hard drive full').

diagnosis(['system RAM is faulty']) :-
 problem('computer freezes randomly'),
 question_2('does your system shows blue-screen errors at startup?').

diagnosis(['bad hard drive']) :-
 problem('computer freezes randomly'),
 question_3('does your hard drive make loud noise?').

diagnosis(['bad hard drive']) :-
 problem('computer freezes randomly'),
 question_4('does your computer boot slowly?').

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%% Blue-screens %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

diagnosis(['Bad memory modules']) :-
 problem('Blue-screens'),
 nl,
 write('>> check memory with memtester and see if you get errors <<'),
 nl,
 write('>> if you do get errors and have more than one slots occupied <<'),
 nl,
 write('>> then test one by one and see if it works <<'),
 nl,
 question_1('did the test work?').

diagnosis(['corrupt drivers installed']) :-
 problem('Blue-screens'),
 nl,
 write('>> perform system restore to uninstall the corrupted drivers <<').

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%% Monitor is blank %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

diagnosis(['no power to monitor']) :-
 problem('Monitor is blank'),
 question_1('check if the monitor connected to power source?').

diagnosis(['monitor not connected to computer']) :-
 problem('Monitor is blank'),
 question_2('is the monitor connected to the CPU?').

diagnosis(['screen-saver enabled']) :-
 problem('Monitor is blank'),
 question_3('check if screen-saver is enabled').

diagnosis(['display card not connected']) :-
 problem('Monitor is blank'),
 question_4('is display card connected?').








%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%% This is where the asking starts %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
problem(X):- menuask(problem,X,['Audio Sound Card not detected',
                'Audio Driver Warning', 'Scratchy Sound',
                'Num lock stays off at startup','Invalid Drive Specification Error',
              'Mouse Pointer Jerks Onscreen', 'System Cant find my Hard Drive', 'Random shutdown when working on computer',
               'computer freezes randomly', 'Blue-screens', 'Monitor is blank']).           % shows menu
question_1(X):- ask(question_1,X).
question_2(X):- ask(question_2,X).
question_3(X):- ask(question_3,X).
question_4(X):- ask(question_4,X).
question_5(X):- ask(question_5,X).
question_6(X):- ask(question_6,X).
question_7(X):- ask(question_7,X).
question_8(X):- ask(question_8,X).
question_9(X):- ask(question_9,X).
question_10(X):- ask(question_10,X).
question_11(X):- ask(question_11,X).
question_12(X):- ask(question_12,X).

% "ask" only deals with simple yes or no answers. a "yes" is the only
% yes value. any other response is considered a "no".

ask(Attribute,Value):-
  known(yes,Attribute,Value),       % succeed if we know its true
  !.                                % and dont look any further
ask(Attribute,Value):-
  known(_,Attribute,Value),         % fail if we know its false
  !, fail.

ask(Attribute,_):-
  (known(yes,Attribute,_)),           % fail if we know its some other value.
  !, fail.                          % the cut in clause #1 ensures that if
                                    % we get here the value is wrong.
ask(A,V):-
  write(A:V),                       % if we get here, we need to ask.
  write('? (yes or no): '),
  read(Y),                          % get the answer
  asserta(known(Y,A,V)),            % remember it so we dont ask again.
  Y = yes.                          % succeed or fail based on answer.

% "menuask" is like ask, only it gives the user a menu to to choose
% from rather than a yes on no answer.

menuask(Attribute,Value,_) :-
  known(yes,Attribute,Value),       % succeed if we know
  !.
menuask(Attribute,_,_) :-
  known(yes,Attribute,_),           % fail if its some other value
  !, fail.

menuask(Attribute,AskValue,Menu):-
  nl,write('What is the '),write(Attribute),write('?'),nl,
  display_menu(Menu),
  write('Enter the number of choice> '),
  read(Num),nl,
  pick_menu(Num,AnswerValue,Menu),
  asserta(known(yes,Attribute,AnswerValue)),
  AskValue = AnswerValue.           % succeed or fail based on answer

display_menu(Menu) :-
  disp_menu(1,Menu), !.             % make sure we fail on backtracking

disp_menu(_,[]).
disp_menu(N,[Item | Rest]) :-        % recursively write the head of
  write(N),write(' : '),write(Item),nl, % the list and disp_menu the tail
  NN is N + 1,
  disp_menu(NN,Rest).

pick_menu(N,Val,Menu) :-
  integer(N),                       % make sure they gave a number
  pic_menu(1,N,Val,Menu), !.        % start at one
  pick_menu(Val,Val,_).             % if they didn't enter a number, use
                                    % what they entered as the value

pic_menu(_,_,none_of_the_above,[]). % if we've exhausted the list
pic_menu(N,N, Item, [Item|_]).      % the counter matches the number
pic_menu(Ctr,N, Val, [_|Rest]) :-
  NextCtr is Ctr + 1,               % try the next one
  pic_menu(NextCtr, N, Val, Rest).

【问题讨论】:

  • 所以不是教程网站。到目前为止,您尝试过什么来实现您想要的?

标签: prolog exe


【解决方案1】:

由于您的代码在快速阅读时看起来很好移植,您可以使用 GNU Prolog 从中生成一个.exe 文件。假设代码保存在一个名为 foo.pl 的文件中,您可以使用 GNU Prolog gplc 命令行实用程序来生成您的可执行文件:

$ gplc --no-top-level -o foo.exe foo.pl

但首先您需要在文件顶部的代码中添加以下指令:

:- initialization(main).
:- dynamic(known/3).

gplc 实用程序将在没有dynamic/1 指令的情况下报告错误。运行foo.exe 将打印:

$ ./foo.exe
Welcome to Micro-Computer troubleshooting
Please do not forget to type all your answers with a period(.) in the end

What is the problem?
1 : Audio Sound Card not detected
2 : Audio Driver Warning
3 : Scratchy Sound
4 : Num lock stays off at startup
5 : Invalid Drive Specification Error
6 : Mouse Pointer Jerks Onscreen
7 : System Cant find my Hard Drive
8 : Random shutdown when working on computer
9 : computer freezes randomly
10 : Blue-screens
11 : Monitor is blank
Enter the number of choice> 

附: GNU Prolog 是少数可用的 Prolog 编译器之一,它可以生成真正的 .exe 文件,您可以将其分发给其他人,而无需他们也安装 GNU Prolog。

【讨论】:

  • 我现在就安装 GNU Prolog 并照你说的做。谢谢你,我真的很感谢你的帮助。我会告诉你进展如何。
  • 我已经安装了 GNU Prolog,并且我已经在我的代码中插入了 do 指令,但是 gplc 命令行会自行打开和关闭。我不知道问题是不是在 windows10 上运行。
  • 我无法访问 Windows 10,但似乎缺少某些依赖项,可能是 gplc 调用的受支持的 C 编译器以在该操作系统上生成本机代码。
  • 请告诉我如何使用 swi-prolog 使程序可执行。
  • @osca1 您还在寻找使用 swi-prolog 的解决方案吗?
猜你喜欢
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
相关资源
最近更新 更多