prolog 相关问题

Prolog是最常用的逻辑编程语言。它通过按时间顺序回溯和通过统一的模式匹配来支持非确定性编程。



如何公平地列举树木?

我们用原子“ nil”代表空树和术语t(x,l,r)一词的非空树,其中x分别表示root节点,l和r分别表示左和右subtree 。 因此,pred ...

回答 0 投票 0


我如何将参数传递给iChiban/prolog的查询功能? 我有以下GO代码: 包装主 进口 ( “语境” _“嵌入” “ FMT” “弦” “时间” “github.com/ichiban/p...

package main import ( "context" _ "embed" "fmt" "strings" "time" "github.com/ichiban/prolog" ) //go:embed permissions.pl var permissions string type User struct { Name string Roles []string } func (u *User) CheckPerm(ctx context.Context, model, op string) bool { userRules := make([]string, 0, len(u.Roles)) for _, role := range u.Roles { userRules = append(userRules, fmt.Sprintf("hasRole(user, %s).", role)) } rules := strings.Join(userRules, "\n") p := prolog.New(nil, nil) err := p.ExecContext(ctx, permissions) if err != nil { panic(err) } err = p.ExecContext(ctx, rules) if err != nil { panic(err) } // result, err := p.QueryContext(ctx, fmt.Sprintf("checkPerm(user, %s, %s).", model, op)) result, err := p.QueryContext(ctx, "checkPerm(user, ?, ?).", model, op) if err != nil { panic(err) } return result.Next() } func main() { start := time.Now() defer func() { fmt.Printf("DONE: %s\n", time.Since(start)) }() user := &User{ Name: "Alice", Roles: []string{"jobadmin"}, } ctx := context.Background() fmt.Println(user.CheckPerm(ctx, "jobs", "write")) }

回答 1 投票 0

练习

我必须成对与6个项目学生见面,我有3个可以做到这一点,但是有一些约束。 让我们称学生为学生1等,插槽插槽1等。

回答 1 投票 0

Prolog二进制添加而无需切割(!)

我们不允许使用切割(!)解决此问题。所以我知道我必须实施各种加法器。目前,我已经添加了具有所需谓词的数字:

回答 1 投票 0

SWI Prolog中的此错误消息是什么意思?

的输入而看到这一点 << (last release gives the question) some sort of in joke I t...

回答 1 投票 0

Prolog 语言中的冒泡排序

我必须实现冒泡排序功能(排序算法)。 我已经实现了冒泡排序和交换,这是冒泡排序的帮助功能: 交换([X,Y | T1],[Y,X | T1]):-(Y 我必须实现冒泡排序功能(排序算法)。 我已经实现了bubblesort和swap,bubblesort的帮助功能: swap([X,Y|T1],[Y,X|T1]):-(Y<X,!). swap([X|T1],[X|T2]):- swap(T1,T2). bubblesort([],[]) :- !. bubblesort(T1,T2) :- (bubblesort(swap(T1,T2),T2)). 我陷入无限循环。我必须保留函数的签名: 冒泡排序(T1,T2) 我在这个问题上纠结了两个小时。有谁知道我该怎么做? 直到交换程序没有变化为止,继续交换。如果交换没有变化,那么您已经对列表进行了排序。 bubblesort ( List, SortedList) :- swap ( List, List1 ), ! , bubblesort ( List1, SortedList) . bubblesort ( List, List). swap ( [ X, Y | Rest ], [ Y, X | Rest ] ) :- X > Y, ! . swap ( [ Z | Rest ], [ Z | Rest1 ] ) : - swap (Rest, Rest1 ). 写出如此低效的东西几乎让人痛苦: bubblesort(L, L1) :- ( bubble(L, L2) -> bubblesort(L2, L1) ; L = L1 ). bubble([A, B|T], L) :- ( A > B -> L = [B, A|T] ; L = [A | L1], bubble([B|T], L1)). :- bubblesort([2,4,2,3, 2, 6,6,3,1, 11, 2, 3, 1], Out). 简单的冒泡排序算法由两个主要循环组成: 遍历列表,如果每对元素不“按顺序”,则“交换”它们(内循环)。 对结果重复(1),直到列表完全排序(外循环)。 内循环(1)可以这样表示: % performs a single pass of a bubble-sort on a list do_bubble_sort([], []). do_bubble_sort([X], [X]). do_bubble_sort([X0,X1|Xs], [X0|Rem]) :- X0 =< X1, !, do_bubble_sort([X1|Xs], Rem). do_bubble_sort([X0,X1|Xs], [X1|Rem]) :- do_bubble_sort([X0|Xs], Rem). 上面的 do_bubble_sort/2 接受一个列表,如果不满足 =< 测试(第三个子句),则递归地交换列表中的连续元素。然后,该内部循环由外部循环谓词 bubble_sort/2 调用,如下所示: % repeatedly performs a bubble sort on a list until it is sorted bubble_sort(L, SL) :- do_bubble_sort(L, L0), (sorted_order(L0) -> SL = L0 ; bubble_sort(L0, SL) ). 此谓词采用输入列表并递归应用 do_bubble_sort/2 直到谓词 sorted_order/1 在结果上成功,即列表最终已排序。 sorted_order/1可以这样定义: % checks a list of things are in sorted (ascending) order sorted_order([]). sorted_order([_]) :- !. sorted_order([X0,X1|R]) :- X0 =< X1, sorted_order([X1|R]). 这个谓词采用一个列表,并递归地检查每对连续元素是否按排序顺序(通过 =< 测试,就像我们在 do_bubble_sort/2 中使用的那样 - 这很重要,否则算法可能不会终止!) 问题是由递归查询引起的。查询bubblesort(T1, T2)时, 它查询 bubblesort(swap(T1, T2), T2),然后通过 bubblesort/2 的第二个子句, bubblesort(swap(swap(T1, T2), T2'), T2)和T2统一为T2,然后循环。 它永远不会得到 swap(T1, T2) 查询的第一个结果。 bubblesort ( List, SortedList) :- swap ( List, List1 ), ! , bubblesort ( List1, SortedList) . bubblesort ( List, List). bubbleSort(InputList,SortList):-swap(InputList,List), !, printList(List), bubbleSort(List,SortList). bubbleSort(SortList,SortList). swap([X,Y|T],[Y,X|T]):-X>Y. swap([Z|T],[Z|T1]):-swap(T,T1). printList([]):-nl. printList([Head|List]):-write(Head), write(' '), printList(List). 冒泡排序的另一个版本是: bs(L1,L2) :- true , ( append(X,[A,B|Y],L1), A > B) -> ( append(X,[B,A|Y],T), bs(T,L2) ) ; L1 = L2 . 简短测试: ?- permutation( [1, 2, 3, 4], L), bs( L, X), writeln( L - X), false. [1,2,3,4]-[1,2,3,4] [1,2,4,3]-[1,2,3,4] [1,3,2,4]-[1,2,3,4] [1,3,4,2]-[1,2,3,4] [1,4,2,3]-[1,2,3,4] [1,4,3,2]-[1,2,3,4] [2,1,3,4]-[1,2,3,4] [2,1,4,3]-[1,2,3,4] [2,3,1,4]-[1,2,3,4] [2,3,4,1]-[1,2,3,4] [2,4,1,3]-[1,2,3,4] [2,4,3,1]-[1,2,3,4] [3,1,2,4]-[1,2,3,4] [3,1,4,2]-[1,2,3,4] [3,2,1,4]-[1,2,3,4] [3,2,4,1]-[1,2,3,4] [3,4,1,2]-[1,2,3,4] [3,4,2,1]-[1,2,3,4] [4,1,2,3]-[1,2,3,4] [4,1,3,2]-[1,2,3,4] [4,2,1,3]-[1,2,3,4] [4,2,3,1]-[1,2,3,4] [4,3,1,2]-[1,2,3,4] [4,3,2,1]-[1,2,3,4] false. 这适用于 swi-prolog。

回答 7 投票 0

Sicstus CLPFD 标记时间差异

我使用 Sicstus Prolog 来解决 Advent of Code 2024 Day 13,我发现同一约束模型的不同实例之间的标记时间存在令人惊讶的差异。我有: 最小Cos...

回答 1 投票 0

从字符解析为数字Prolog

我有以下内容: is_digit(X):-char_type(X,digit)。 当我这样称呼它时: 是_数字(X)。 我得到以下结果: X='0'; X='1'; ...; X='9' 我需要得到相同的结果但是

回答 3 投票 0

Prolog:获取列表的前“N”个元素

我需要编写一个 Prolog 谓词 take(L, N, L1),如果列表 L1 以相同的顺序包含列表 L 的前 N 个元素,则该谓词会成功。例如: ?- 采用([5,1,2,7], 3, L1)。 L1 = [5,1,2] ?- 采取...

回答 8 投票 0

Prolog 过滤自定义目标失败的所有元素的列表

我正在尝试编写一个谓词过滤器(List,PredName,Result),它过滤目标 PredName 失败的所有元素的列表,然后返回结果列表。谓词 Pre...

回答 3 投票 0

传递给库元谓词的目标模块扩展

使用SWI-Prolog(多线程,64位,版本7.3.5), 我们一步步进行: 在模块 dcgAux 中定义 dcg 非终结符 a//1(发音:“di-SEE-goh”): :- 模块(dcgAux,[a//1])。 一个(0)-->...

回答 1 投票 0

有在prolog中开发口语对话系统的教程吗?

我想在酒吧环境中实现一个人机语音对话系统,该系统将用户的文本短语作为输入(对给定产品的请求:薯条、可乐、水、咖啡等...... .

回答 1 投票 0

读取文件并在序言中构建事实

我想构建一种机制,根据txt文件构建不同的事实, 在序言中导入。我已经找到了一些例子,他们直接断言已读取的行

回答 3 投票 0

prolog 中列表中包含的向量之间的距离

我对序言很陌生,我正在尝试编写一个谓词 distance_all(列表,距离列表)。 其输入是包含向量坐标的列表的列表: 输入 = [[1,2,3],[2,3,4],[1,7,3],[...

回答 4 投票 0

具体化memberd_t/3的更好定义

“Indexing diff/2”的第 7 节讨论了一般具体化,并为具体化列表成员给出了以下定义: memberd_t(X, Es, T) :- l_memberd_t(Es, X, T)。 l_会员...

回答 1 投票 0

如何在 Prolog DCG 中不使用剪切来表达“不”

我正在开发 Prolog DCG 解析器,将字符串标记为特定模式。我的目标是解析像 mul(Number,Number)、do() 和 dont() 这样的标记,同时忽略所有其他模式。 这是我的

回答 1 投票 0

纯append/3模式(-,+,+)不会留下选择点

通常的append/3是纯粹的,但它为模式(-,+,+)留下了一个选择点: ?- 追加(X, [3], [1,2,3])。 X = [1, 2] ; 错误的。 你是上述结果中的一个选择点,可以从以下例子中看出......

回答 3 投票 0

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.