gpt4 book ai didi

macros - 创建自定义枚举的 Prolog 快捷方式

转载 作者:行者123 更新时间:2023-12-04 19:30:57 26 4
gpt4 key购买 nike

我正在尝试通过一系列事实创建自定义枚举。

greater(X,Y) :- less (Y,X).less(a,b).less(b,c).less(c,d).

这工作正常,但是有明显的重复。

我正在努力减少它。有没有一种方法可以通过转换将数组用于简单的线性事实序列?

transform([a,b,c,d])resulting in the same less definitions.

我已经创建了一个“less”定义,它使用数组和 nextto/member 函数来测试,但是我不能像使用单独的声明那样添加异常或等效情况。因此,我有兴趣简化简单的案例定义,然后希望用更多的定义来补充它。

这让我想起了 lisp 中 defmacro 的用处。

谢谢。

编辑:

我能够使用断言生成一个系列。它成功定义了所有内容,但返回错误。我觉得这不是正确的方法。

set_less([]).set_less([X,Y|L]):- assert( myless(X,Y) ) , set_less([Y|L]).:- set_less([a,b,c,d]).Output: Goal (directive) failed: user:set_less([a, b, c, d])?- listing.:- dynamic myless/2.myless(a, b).myless(b, c).myless(c, d).

第二次编辑:

mylist([a,b,c,d]).set_less([]).set_less([_]).  ----- Key!set_less([X,Y|L]):- assert( myless(X,Y) ) , set_less([Y|L]).:- set_less([a,b,c,d]).

这确实有效!这是定义自定义枚举的好方法吗?我看到它现在可以工作了,谢谢!

最佳答案

term_expansion(list_enumerate(Name,List), [mylist(Name,List)|Flist]) :-    list_enumerate_to_list(List, Flist).list_enumerate_to_list([], []).list_enumerate_to_list([_], []).list_enumerate_to_list([X,Y|Xs], [myless(X,Y)|Ys]) :-        list_enumerate_to_list([Y|Xs], Ys).list_enumerate(test,[a1,b1,c1,d1]).list_enumerate(first,[a,b,c,d]).list_enumerate(second,[f,e,g,h]).testless(X,Y) :- myless(X,Y).testless(X,Y) :- myless(X,Z) , testless(Z,Y).Output---------------------------------------------------------------?- listing.myless(a1, b1).myless(b1, c1).myless(c1, d1).myless(a, b).myless(b, c).myless(c, d).myless(f, e).myless(e, g).myless(g, h).?- testless(a1,c1).true ;false.?- testless(X,c1).X = b1 ;X = a1 ;false.

行得通!感谢 freenode 上#prolog 上的 soupdragon。

启动时有一些警告,但可以忽略。

关于macros - 创建自定义枚举的 Prolog 快捷方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2063985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com