我开始学习逻辑编程,并对是否可以从数据集中获得一些规则感兴趣。例如
有以下事实
// assume programming language, doesn't know what numbers are
IS(1, INDEX)
IS(2, INDEX)
IS(3, INDEX)
IS(4, INDEX)
// add some relations between numbers, for e.g. next number after 1 is 2, after 2 is 3, and so on
NEXT(1,2)
NEXT(2,3)
NEXT(3,4)
IS_ODD(1, TRUE)
IS_ODD(2, FALSE)
IS_ODD(3, TRUE)
IS_ODD(4, FALSE)
所以,从这些事实中,我想知道是否有任何算法/方法可以帮助推导出例如以下规则
IS_ODD(B, FALSE) :- IS_ODD(A, true), NEXT(A, B)
首先,您必须用小写字母写这些谓词名称(IS_ODD
,IS
,NEXT
)。否则Prolog会认为这些是变量。
第二,我假设您想对Peano公理进行编码。您可以使用十进制记数法来表示这些数字,但是您必须使用prolog内置的算术来处理它们。你如何从10
得到11
,除非你列举所有无限多的后继关系?你必须使用+
。但这是一种循环。你想从零开始推导加法,对吧?
这个方法怎么样
is(0).
is(succ(N)) :- is(N).
is_odd(succ(0)).
is_odd(succ(succ(N))) :- is_odd(N).
现在你可以做像
这样的查询?- is_odd(succ(succ(succ(0)))).
true
?- is(Nat).
Nat = 0 ;
Nat = succ(0) ;
Nat = succ(succ(0)) ;
Nat = succ(succ(succ(0))) ;
Nat = succ(succ(succ(succ(0)))) ;
Nat = succ(succ(succ(succ(succ(0))))) ;
...
不要认为succ()
是一个函数或谓词或任何以某种方式执行的东西。它只是作为一个包装或容器。您也可以将其命名为s()
或next()
或任何您想要的名称。
Try in SWISH: https://swish.swi-prolog.org/p/peano-axioms.pl