2017-10-19 31 views
0

我是Prolog的新手,我在菜单中遇到循环编号问题。菜单序言中的循环编号

这里是编码:

la3:-nl, 
    write('-------MENU-------'),nl, 
    write('1. Biodata'),nl, 
    write('2. Looping Number'),nl, 
    write('3. Exit'),nl, 
    write('Choose : '),read(Z), 
    (
    Z=1,nl, 
    write('BIODATA'),nl, 
    write('Input your name : '),read(J),nl, 
    write('Input your Identity number : '),read(K),nl, 
    write('Input your class : '),read(L),nl, 
    write('---------------------'),nl, 
    write('Name : '),write(J),nl, 
    write('Identity number : '),write(K),nl, 
    write('Class : '),write(L),nl, 
    la3; 

    Z=2,nl, 
    write('LOOPING NUMBER'),nl, 
    loop(0), 
    loop(N):-N>0,write('Value : '),write(N),nl, 
    M is N-1,loop(M), 
    la3; 



    Z=3,nl, 
    write('EXIT'),nl 
    ). 

我不知道该怎么做循环和上面的代码不起作用。

+2

你能更好地解释你正在尝试做什么,以及从尝试你发布的代码中看到的结果吗? – bakoyaro

+1

这里有一些语法问题。特别是,'... loop(0),loop(N): - N> 0,...' – lurker

+2

如果你为自己做这件事,你看过SWI Prolog的['library(tty)'](http ://www.swi-prolog.org/pldoc/doc/_SWI_/library/tty.pl)?在那里有一个很好的'menu/3'谓词来建立这些菜单。 –

回答

1

Prolog与其他语言有一些共同之处在于最好是模块化思考。它看起来像你试图捕获一个谓词子句中的所有功能,这是一个尴尬和糟糕的结构。

首先通过获取顶级菜单工作。这基于Prolog中常见的简单循环模式:repeat, ..., fail

main :- 
    repeat, 
    write('-------MENU-------'), nl, 
    write('1. Biodata'), nl, 
    write('2. Looping Number'), nl, 
    write('3. Exit'), nl, 
    write('Choose : '), 
    read(Z), 
    (Z = 3 -> !, fail ; true), % fail without backtrack if Z = 3 
    action_for(Z), 
    fail. 

然后你可以在action_for/1上工作。这里有一个存根action_for/1

action_for(X) :- 
    write('Action for '), 
    write(X), nl. 

当你执行它,你就会得到这样的:

| ?- main. 
-------MENU------- 
1. Biodata 
2. Looping Number 
3. Exit 
Choose : 1. 
Action for 1 
-------MENU------- 
1. Biodata 
2. Looping Number 
3. Exit 
Choose : 2. 
Action for 2 
-------MENU------- 
1. Biodata 
2. Looping Number 
3. Exit 
Choose : 3. 

no 
| ?- 

所以基本的循环和菜单行为是否到位。

我将留下适当的实施action_for/1作为练习。

+0

我的意思是,我一直在搜索循环编号,但是当我把它放入菜单时,它只是不起作用 –

+0

@Pratama我的回答是否为你清楚了事情?确实没有一个好方法来修复现有的代码。它需要重组,因为它试图是必要的,而Prolog是关系型的。 – lurker