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

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


您没有登录。 请登录注册

不会写下面的代码,求教

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

1 不会写下面的代码,求教 于 周二 十一月 20, 2012 3:39 am

写一个版本的call_lambda,其中第一个参数是一个lambda表达式,使call_lambda替代的lambda,然后进入第二个参数调用的结果。
call_lambda(X^append([a], X, [a, b]), A)
使append([a], A, [a, b]),得到 A=[b].
最多有三个参数,使call_lambda(X^Y^Z^foo(Y, X, Z), a, b, c), 得到 foo(b, a, c).

谢啦

查阅用户资料

2 回复: 不会写下面的代码,求教 于 周二 十一月 20, 2012 7:39 am

xhdengfei 写道::写一个版本的call_lambda,其中第一个参数是一个lambda表达式,使call_lambda替代的lambda,然后进入第二个参数调用的结果。
call_lambda(X^append([a], X, [a, b]), A)
使append([a], A, [a, b]),得到 A=[b].
最多有三个参数,使call_lambda(X^Y^Z^foo(Y, X, Z), a, b, c), 得到 foo(b, a, c).

谢啦

查call_lambda(X^append([a],X,[a,b]), A)时,应该是符合 call_lambda(A^G, B) :- ... 的样式。

做法就是普通lambda教程文件所讲的, (\ x . M) y ==> M[y/x] ,在M中找到x,取代为y。

写起来可能是这样,
代码:
call_lambda(A^G, B) :- A = B, call(G).

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

3 回复: 不会写下面的代码,求教 于 周二 十一月 20, 2012 3:31 pm

对之前提出的方式提一些修正:因为最後说「使call_lambda(X^Y^Z^foo(Y,X,Z), a, b, c)得到foo(b,a,c)」,所以其中不需要使用call/1。基本应该是写成
代码:
call_lambda(X^G, Y, G) :- X = Y.
?- call_lambda(X^append([a],X,[a,b]), A, R).

至於X^Y^Z^foo(Y,X,Z)这种表示法,若把^当作是分隔符号,则此式子看起来是另一种列表。可以当做因为foo(Y,X,Z)不能匹配A^B格式,所以foo(Y,X,Z)是一个列表的基础。然後前面加个Z变成Z^foo(Y,X,Z),再前面加个X就是X^Z^foo(Y,X,Z),像这样子。所以要写出三个参数,或更多个参数,看起来很简单了。但是对prolog来说, call_lambda(X^Y^Z^foo(Y,X,Z),a,b,c) 这样的写法有点奇怪,prolog并不是由这样一个call_lambda语句返回一个结果,我想除了多加一个参数当做返回值是个办法。

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

4 回复: 不会写下面的代码,求教 于 周二 十一月 20, 2012 8:56 pm

yauhsien 写道::对之前提出的方式提一些修正:因为最後说「使call_lambda(X^Y^Z^foo(Y,X,Z), a, b, c)得到foo(b,a,c)」,所以其中不需要使用call/1。基本应该是写成
代码:
call_lambda(X^G, Y, G) :- X = Y.
?- call_lambda(X^append([a],X,[a,b]), A, R).

至於X^Y^Z^foo(Y,X,Z)这种表示法,若把^当作是分隔符号,则此式子看起来是另一种列表。可以当做因为foo(Y,X,Z)不能匹配A^B格式,所以foo(Y,X,Z)是一个列表的基础。然後前面加个Z变成Z^foo(Y,X,Z),再前面加个X就是X^Z^foo(Y,X,Z),像这样子。所以要写出三个参数,或更多个参数,看起来很简单了。但是对prolog来说, call_lambda(X^Y^Z^foo(Y,X,Z),a,b,c) 这样的写法有点奇怪,prolog并不是由这样一个call_lambda语句返回一个结果,我想除了多加一个参数当做返回值是个办法。

谢啦~~~成功了

查阅用户资料

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

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