Prolog 人工智能语言中文论坛---打造优质Prolog学习交流园地

一个供Prolog爱好者学习与交流的地方


您没有登录。 请登录注册

用prolog编写入栈,出现问

浏览上一个主题 浏览下一个主题 向下  留言 [第1页/共1页]

1 用prolog编写入栈,出现问 于 周日 二月 08, 2015 7:00 am

empty_stack([]).
stack([],[],[]).
stack(Top,Stack,[Top|Stack]).

push_stack(Top,Stack,Newstack):-stack(Top,Stack,Newstack).
pop_stack(Top,Tail,Stack):-stack(Top,Tail,Stack).
pick_stack(Top,Stack):-stack(Top,_,Stack).
member_stack(Element,Stack):-member(Element,Stack).
valid([],New,Result):-!.
valid([Head|Tail],Old,Result):-empty_stack(Old),fail.
valid([Head|Tail],Old,Result):-push_stack(Head,Old,Result),write(Result),valid(Tail,Result,Y).

post2pre([],[]).
post2pre(Expression,Result):-
valid(Expression,Old,Result).

如果输入?-post2pre([1,2,3],Result)
这是本人的程序,返回的Result=[1]。可是我在valid(Tail,Result,Y)后面加入write(Result)。却是可以显示Result是[3,2,1]
纠结了一天了,不知道哪里出错了。
因为要求是需要直接将[1,2,3]顺次出栈压入Result中。求各位大神帮忙看看

查阅用户资料

2 回复: 用prolog编写入栈,出现问 于 周六 三月 07, 2015 6:57 pm

你的程序有 Prolog 該有的構造,但是有一些錯漏,使程序不完整。

1. 重復的謂詞太多:

push_stack/3 和 pop_stack/3 是同樣,
代码:

push_stack(Top,Stack,Newstack):-stack(Top,Stack,Newstack).
pop_stack(Top,Tail,Stack):-stack(Top,Tail,Stack).

但只要用 stack/3 就可以代表 push_stack/3 和 pop_stack/3 。
並且 stack/3 也可以代替 pick_stack/2 。
代码:

stack(Top,Stack,[Top|Stack]).

pick_stack(Top,Stack):-stack(Top,_,Stack).

2. 在同一句裡制造 Singleton variable ,意謂這一句可能不完整:

都在 valid/3 ,從第一句就錯了:
代码:

valid([],New,Result):-!.

上面 New 和 Result 都是 Singleton ,哪個都對不上。
對的写法是:
代码:

valid([], Result, Result) :- !.

第二和第三個変量對上了。

接下二句:
代码:

valid([Head|Tail],Old,Result):-empty_stack(Old),fail.
valid([Head|Tail],Old,Result):-push_stack(Head,Old,Result),write(Result),valid(Tail,Result,Y).

二句的 head 同樣是 valid([Head|Tail],Old,Result) ,重復了。
第三句的最後跑出一個 Singleton 叫做 Y ,這個 Y 要放哪個地方?沒地方放。

對的寫法應該是這樣:
代码:

valid([Head|Tail],Old,Result):-
    stack(Head,Old,Result1),
    valid(Tail,Result1,Result).

同樣,看 post2pre/2 也有 Singleton 叫做 Old :
代码:

post2pre([],[]).
post2pre(Expression,Result):-
valid(Expression,Old,Result).

對的寫法應該是:
代码:

post2pre([],[]).
post2pre(Expression,Result):-
valid(Expression,[],Result).

3. 把不需要的語句去除,修改好的程序是:

代码:

stack(Top,Stack,[Top|Stack]).

valid([],Result,Result).
valid([Head|Tail],Old,Result):-stack(Head,Old,Result1),valid(Tail,Result1,Result).

post2pre([],[]).
post2pre(Expression,Result):-
valid(Expression,[],Result).

查阅用户资料 http://yauhsien.wordpress.com

浏览上一个主题 浏览下一个主题 返回页首  留言 [第1页/共1页]

您在这个论坛的权限:
不能在这个论坛回复主题