计算数学精解【8】-prolog计算精解(4)

文章目录

谓词

  • ?Term1 = ?Term2
    如果统一成功,那就对了。它的作用就好像是由以下事实定义的:
=(Term, Term).
?- X=99,write(X).
99
X = 99.

?- X=99+11,write(X).
99+11
X = 99+11.

?- X=(99+11),write(X).
99+11
X = 99+11.

?- X=(99+11),write(X).
99+11
X = 99+11.
  • 列表头和列表尾
get_head([X|_], X).
get_tail([_|T],T).


?- get_head([1,2,3],Z).
Z = 1.

?- get_tail([1,2,3],Z).
Z = [2, 3].
get_head([X|_], X).
get_tail([_|T],T).
to_print_tail(L):-get_tail(L,Tail),write(Tail).
?- load('e:/learn/learn.pl').
Correct to: "win_menu:load('e:/learn/learn.pl')"? 
Please answer 'y' or 'n'? yes
true.

?- to_print_tail([22,3,44,55]).
[3,44,55]
true.
get_head([X|_], X).
to_print_head(L):-get_head(L,Head),write(Head).
?- load('e:/learn/learn.pl').
Correct to: "win_menu:load('e:/learn/learn.pl')"? 
Please answer 'y' or 'n'? yes
true.

?- to_print_head([22,3,44,55]).
22
true.
get_head([X|T], X,T).
to_print(L):-get_head(L,Head,Tail),write(Head),nl,to_print(Tail).
to_print([]):-nl.
?- load('e:/learn/learn.pl').
Correct to: "win_menu:load('e:/learn/learn.pl')"? 
Please answer 'y' or 'n'? yes
true.

?- to_print([22,3,44,55]).
22
3
44
55

true
  • length
    如果Length表示List中元素的个数,则为True。该谓词是一个真关系,可用于查找列表的长度或生成长度为length的列表(包含变量)。该谓词是非确定性的,如果List是部分列表且length是变量,则生成长度递增的列表。
    length(?List, ?Length)
?- length(Z,5).
Z = [_, _, _, _, _].
?- length([1, 2, 3], Length).
Length = 3.
  • repeat
    在Prolog中,repeat是一个特殊的内部谓词,其行为与其他常规谓词有所不同。repeat的主要特点是,在第一次调用时它总是成功的,并且在回溯过程中也始终成功。这意味着,一旦repeat被调用,流程就不可能通过回溯来绕过它。

以下内容由文心一言自动生成
repeat的基本行为

  • 第一次调用成功:当repeat在Prolog程序中第一次被调用时,它会被视为成功(即返回true),这使得程序可以继续执行其后的子句。
  • 回溯时始终成功:在Prolog的搜索过程中,如果遇到需要回溯的情况,repeat在回溯时也会被视为成功。这意味着,只要程序中包含了repeat,并且其后没有其他明确的终止条件(如fail谓词或满足特定条件的子句),程序就可能会陷入无限循环。

使用repeat的场景

  • 编写死循环:由于repeat在回溯时始终成功,因此可以很容易地用它来编写死循环的Prolog程序。只需在repeat后放置一个总是失败的谓词(如fail),或者没有明确的终止条件,程序就会不断重复执行。
  • 循环直到条件满足:另一种使用repeat的方式是,在其后放置一系列目标和一个测试条件。程序将不断循环执行这些目标,直到测试条件满足为止。这类似于其他编程语言中的“do-until”循环。

示例

以下是一个简单的Prolog程序示例,展示了如何使用repeat来创建一个简单的命令循环,直到用户输入特定的命令(如"end")为止:

command_loop :-
    repeat,
    write('Enter command (end to exit): '),
    read(X),
    write(X),
    nl,
    (X = end -> ! ; true).

在这个示例中,repeat确保了命令循环的持续执行。程序会不断提示用户输入命令,并将输入的命令打印出来,直到用户输入"end"为止。这里使用了cut操作符(!)来避免在找到匹配条件后继续回溯,从而优化程序的执行效率。

注意事项

  • 由于repeat的特殊行为,它可能会导致程序进入无限循环,除非有明确的终止条件。
  • 在使用repeat时,需要仔细考虑程序的逻辑和终止条件,以避免不必要的资源消耗和程序崩溃。

综上所述,repeat是Prolog中一个强大的工具,可以用于编写需要循环执行的程序部分。然而,由于其特殊的行为特性,使用时需要格外小心。

参考文献

1.https://gprolog.org/
2.https://www.swi-prolog.org/
3.文心一言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值