我刚刚开始学习Prolog。我正在从水果样品中练习。但我无法创建允许用户按数字进行选择的结构。我在互联网上看到的示例对水果样本无效。
当我在SWISH-Prolog上运行以下代码时,必须一一写入列表中的值。如何选择“ 1、2、3、4”代替红色,橙色,黄色,绿色,紫色,桃红色?
错误代码块:
menuask(Attr,Val,List) :-
write('What is the value for '),write(Attr),write('? '),nl,write (1. red),write (2. orange),read(Ans),check_val(Ans,Attr,List),asserta(known(yes,Ans)),Ans == Val.
在“菜单”中给出了一个错误。我试过了。
序言所有代码:
:- dynamic(known/3).
:- discontiguous menuask/3.
:- discontiguous ask/2.
%
% % Data: fruit(X) :- attributes(Y)
fruit(banana) :- colour(yellow),shape(crescent).
fruit(apple) :- (colour(green); colour(red)),shape(sphere),stem(yes).
fruit(lemon) :- colour(yellow),(shape(sphere);shape('tapered sphere')),acidic(yes).
fruit(lime) :- colour(green),acidic(yes).
fruit(pear) :- colour(green),shape('tapered sphere').
fruit(plum) :- colour(purple),stone(yes).
fruit(grape) :- (colour(purple);colour(green)),shape(sphere).
fruit(orange) :- colour(orange),shape(sphere).
fruit(satsuma) :- colour(orange),shape('flat sphere').
fruit(peach) :- colour(peach).
fruit(rhubarb) :- (colour(red); colour(green)),shape(stick).
fruit(cherry) :- colour(red),stem(yes),stone(yes).
% Expert recogniser
% Asks
colour(X) :- menuask(colour,X,[red,orange,yellow,green,purple,peach]).
shape(X) :- menuask(shape,[sphere,crescent,'tapered sphere','flat sphere',stick]).
acidic(X) :- ask(acidic,X).
stem(X) :- ask(stem,X).
stone(X) :- ask(stone,X).
% Remember what I've been told is correct
ask(Attr,Val) :- known(yes,Val),!.
menuask(Attr,_) :- known(yes,!.
% % Remember what I've been told is wrong
ask(Attr,Val) :- known(_,!,fail.
menuask(Attr,_) :- known(_,fail.
% Remember when I've been told an attribute has a different value
ask(Attr,V),V \== Val,fail.
% % I don't know this,better ask!
ask(Attr,Val) :- write(Attr:Val),asserta(known(Ans,Val)),Ans == yes.
menuask(Attr,write(List),Ans == Val.
check_val(Ans,_,List) :- member(Ans,!.
check_val(Ans,List) :-
write(Ans),write(' is not a known answer,please try again.'),menuask(Attr,List).
go :- fruit(Fruit),write('The fruit is '),write(Fruit),nl.