2017-10-19 32 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