如何解决Turbo Prolog动态数据库使用时的自由变量报错问题
错误原因
assertz向动态数据库写入事实时,Turbo Prolog不允许事实内存在未绑定的自由变量,你报错行中的movie(_,_,_,_,_,_,_)所有参数都是匿名自由变量,没有绑定具体值,不符合写入要求。
解决方案
根据你的实际业务需求选择对应方案:
方案1:仅需存入歌曲数据,暂不关联有效电影数据
将movie参数的所有字段填入和domain定义匹配的默认占位值即可,字符串类字段填空字符串"",数值类字段填对应类型的默认值,修改后的assertz行参考:
assertz(project(song(A,B,C,D,E,F), movie("","","","","","",0.0))),
注意要和你声明的movie字段类型完全匹配,避免类型不匹配报错。
方案2:需要存入关联的有效电影数据
补充电影字段的输入逻辑,把movie需要的7个参数都绑定具体值后再写入,完整代码参考:
admin(1):- write("Enter Song Name :"),readln(A), write("Enter Song Genre :"),readln(B), write("Enter Release Date :"),readln(C), write("Enter Singer Name :"),readln(D), write("Enter Likes :"),readreal(E), write("Enter DisLikes :"),readreal(F), % 补充电影字段输入逻辑 write("Enter Movie Name :"),readln(G), write("Enter Movie Release Date :"),readln(H), write("Enter Movie Genre :"),readln(I), write("Enter Lead Actor :"),readln(J), write("Enter Lead Actress :"),readln(K), write("Enter Director :"),readln(L), write("Enter Ratings :"),readreal(M), assertz(project(song(A,B,C,D,E,F), movie(G,H,I,J,K,L,M))), save("project.txt"). admin(1).
补充注意事项
- 代码末尾的
admin(1).是递归调用,建议补充退出逻辑,避免无限循环触发输入流程 - 所有输入读取的变量类型要和domain定义的字段类型严格对应,比如实数类型的字段不能输入非数字内容
内容的提问来源于stack exchange,提问作者Prashant Aghara
相关产品推荐
相关产品推荐

