如何在Prolog中要求用户选择?

我刚刚开始学习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.
CARBONARI001 回答:如何在Prolog中要求用户选择?

我不太清楚问题的重点,但这也许会有所帮助。这是有关如何获取与数字输入相对应的名称的简短示例:

fruit(1,apple).
fruit(2,pear).
fruit(3,orange).

read_fruit(FruitName) :-
    repeat,write('Please select a fruit:'),nl,write_fruit_list,read(FruitNumber),(   fruit(FruitNumber,FruitName)
    ->  write('You selected: '),write(FruitName),!
    ;   write('Not a valid choice,try again...'),fail
    ).

write_fruit_list :-
    fruit(N,Name),write(N),write('. '),write(Name),fail.
write_fruit_list.

使用情况如下:

2 ?- read_fruit(F).
Please select a fruit:
1. apple
2. pear
3. orange
|: 4.
Not a valid choice,try again...
Please select a fruit:
1. apple
2. pear
3. orange
|: 3.
You selected: orange
F = orange.

3 ?-

如果要连续不断地要求输入水果,可以将其删除。

本文链接:https://www.f2er.com/2881301.html

大家都在问